none
导出到CSV文件乱码的问题 RRS feed

  • 常规讨论

  • 我是英文系统,代码如下,即使我把编码方式改成GB2312也还是乱码,怎么解决 
                    response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", strFile));
                    response.Charset = "utf-8";
                    response.ContentType = "application/ms-excel";
                    response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                    response.Write(sw);
                    response.Flush();
                    response.End();

    另外我也尝试过Response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
    但是它总是把<meta http-equiv=Content-Type content=text/html;charset=gb2312>输出到CSV文件的第一个单元格,乱码依旧
    2009年3月19日 4:10

全部回复

  • 你好,问题不在于你的Response的设置,而在于你的sw的编码格式问题。
    2009年3月19日 4:46
    版主
  • 你好,sw的Encoding是UTF-16,但这是个只读属性,请问我该如何才能解决这个问题
    2009年3月19日 5:43
  • string name = System.Configuration.ConfigurationSettings.AppSettings["downloadurl"].ToString();
    FileStream fs = new FileStream(name, FileMode.Create, FileAccess.Write);
    StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("gb2312"));


    sw.WriteLine("自动编号,姓名,年龄");
    foreach (DataRow dr in dt.Rows)
    {
        sw.WriteLine(dr["ID"] + "," + dr["vName"] + "," + dr["iAge"]);
    }
    sw.Close();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
    Response.ContentType = "application/ms-excel";// 指定返回的是一个不能被客户端读取的流,必须被下载
    Response.WriteFile(name); // 把文件流发送到客户端
    Response.End();

    重点为红色标记处!
    2009年3月19日 6:10
    版主
  •  string name = System.Configuration.ConfigurationSettings.AppSettings["downloadurl"].ToString();
    FileStream fs = new FileStream(name, FileMode.Create, FileAccess.Write);
    这是不是要在磁盘上创建一个文件
    2009年3月19日 6:59
  • 你好,请说明一下你的意图,是数据库直接输出为CSV吗?
    2009年3月19日 7:13
    版主
  • 只要实现这个重载方法就可以了。new StreamWriter(Stream stream, System.Text.Encoding encoding)
    第一个参数是stream,不一定要FileStream,其他都是可以的,只要是继承与Stream,我刚才给你的代码是我项目中的代码,可能与你要的有所区别,但是解决问题的方式方法就是这样的。
    2009年3月19日 7:22
    版主
  • 能详细一点吗,因为以前没用过Stream,我的代码里的sw是StringWriter
    2009年3月19日 8:15
  • 你好,你把前面的代码粘贴出来,我帮你改改!
    2009年3月19日 8:23
    版主
  • public void ExportToCsv(DataTable dataTable, GridView gridView, HttpResponse response)
            {
                string strFile = "";

                strFile = strFile + "FileName";
                strFile = strFile + DateTime.Now.ToString("yyyyMMddhhmmss");
                strFile = strFile + ".csv";
                ArrayList columnName = new ArrayList();

                using (StringWriter sw = new StringWriter())
                {
                    //获得GridView上显示的标题和绑定列
                    foreach (DataControlField field in gridView.Columns)
                    {
                        if (field is System.Web.UI.WebControls.BoundField && field.HeaderText != String.Empty)
                        {
                            sw.Write(field.HeaderText);
                            sw.Write(",");
                            columnName.Add(((BoundField)field).DataField);
                        }
                    }
                    sw.WriteLine("");

                    //根据绑定列写入数据
                    for (int i = 0; i < dataTable.Rows.Count; i++)
                    {
                        for (int j = 0; j < columnName.Count; j++)
                        {
                            sw.Write(dataTable.Rows[i][columnName[j].ToString()].ToString());
                            sw.Write(",");
                        }
                        sw.WriteLine("");
                    }
                    
                    response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", strFile));
                    response.Charset = "gb2312";
                    response.ContentType = "application/ms-excel";
                    response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
                    response.Write(sw);
                    response.Flush();
                    response.End();
                }


            }

    2009年3月19日 8:42
  •         string strFile = "FileName" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".csv";

            //这一部分替换为你从DataTable/GridView获取的内容
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("id,name");
            sb.AppendLine("1,邹俊才");
            sb.AppendLine("2,才俊邹");
            sb.AppendLine("3,Jon");

            StringWriter sw = new StringWriter(sb);
            sw.Close();

            Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", strFile));
            Response.Charset = "gb2312";
            Response.ContentType = "application/ms-excel";
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.Write(sw);
            Response.Flush();
            Response.End();

    已经经过测试,在我的机器上,不会出现乱码问题。

    jon.valett@gmail.com
    2009年3月19日 9:19
    版主
  • 请问你是在英文操作系统上测试的吗,因为你的代码我之前也试过,始终不行
    2009年3月19日 9:45
  • 不是啊,中文操作系统,windows server 2003 sp2,浏览器是Firefox。
    jon.valett@gmail.com
    2009年3月19日 9:57
    版主
  • 我在4台英文XP系统的机器上测试,两台是office2003,两台2007,两台2003的无法直接打开文件,必需要下载文件, 4台电脑,其中只有一台2003的可以显示中文,其余3台都是乱码
    2009年3月19日 10:10
  • 我刚才在我的另外一台英文机器测试了一下,
    系统是windows server 2003英文版,office2003中文版,
    浏览器是IE6,语言设置是en-us,我这里没有office2007,测试不了。
    如果安装office2007,不需要下载也能打开,在IE安装了插件,office2003就没有,我这里也是要下载。
    jon.valett@gmail.com
    2009年3月19日 10:25
    版主
  • 头都大了
    2009年3月19日 10:33
  •  
    Yi Jie 说:

    我是英文系统,代码如下,即使我把编码方式改成GB2312也还是乱码,怎么解决 
                    response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", strFile));
                    response.Charset = "utf-8";
                    response.ContentType = "application/ms-excel";
                    response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                    response.Write(sw);
                    response.Flush();
                    response.End();

    另外我也尝试过Response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
    但是它总是把<meta http-equiv=Content-Type content=text/html;charset=gb2312>输出到CSV文件的第一个单元格,乱码依旧

    楼主,您好,
    请把 utf-8 改成 utf-7就可以了,您测试下。【我以前做项目遇到这个问题】
    2009年3月24日 8:32
    版主
  • 谢谢,正确的编码应该是gb2312,不过我的问题依然存在
    2009年3月25日 2:43

  • Yi Jie 说:

    谢谢,正确的编码应该是gb2312,不过我的问题依然存在



    您好,昨天我的确很认真的看过您的帖子。

    我知道我的提议,我还是建议你 utf-7 测试下。
    2009年3月25日 8:04
    版主
  • 你好,我确实的试过utf-7, 并且尝试了其他多个编码, 但是始终不行
    2009年3月26日 5:39
  • 我遇到的问题和你一样,所有的编码格式都试了但是问题依然存在,其实不论是UTF-8 还是GB2312都是中文编码格式,这都是没有问题的,问题在你的office上,因为在execl中他不认CSV。

    解决方法

    点击开始----所有程序-----Microsoft Office-----Microsoft Office 工具------Microsoft Office2003/2007/2010 语言设置----把默认语言改成中文。

    问题就解决了。

    希望有所帮助。

    2012年4月10日 7:20