请教:导出csv乱码问题

时间:2023-02-10 10:18:03
GridView1.DataSource = mDataTable;
            GridView1.DataBind();

            GridView1.AllowPaging = false;
            GridView1.AllowSorting = false;

            Response.Clear();
            Response.Buffer = true;
            Response.ContentEncoding = Encoding.GetEncoding("gb2312");
            Response.Charset = "";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding.UTF8));
            Response.ContentType = "text/txt";

            StringBuilder sb = new StringBuilder();

            Page page = new Page();
            HtmlForm form = new HtmlForm();

            GridView1.EnableViewState = false;
            // Deshabilitar la validación de eventos, sólo asp.net 2
            page.EnableEventValidation = false;
            // Realiza las inicializaciones de la instancia de la clase Page que requieran los diseñadores RAD.
            page.DesignerInitialize();

            page.Controls.Add(form);
            form.Controls.Add(GridView1);

            sw = new StringWriter(sb);

            sw.WriteLine(string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}", GridView1.Columns[1].HeaderText, GridView1.Columns[2].HeaderText, GridView1.Columns[3].HeaderText, GridView1.Columns[4].HeaderText, GridView1.Columns[5].HeaderText, GridView1.Columns[6].HeaderText, GridView1.Columns[7].HeaderText, GridView1.Columns[8].HeaderText, GridView1.Columns[9].HeaderText, GridView1.Columns[10].HeaderText.Replace("<br />", ""), GridView1.Columns[11].HeaderText.Replace("<br />", ""), GridView1.Columns[12].HeaderText.Replace("<br />", "")));

            string[] listStr = null;

            if (!string.IsNullOrEmpty(str_check))
            {
                str_check = str_check.Remove(str_check.LastIndexOf(";"));
                listStr = str_check.Split(';');
            }

            if (listStr.Length > 0)
                {
                    int n = 1;
                    int count = 0;
                    foreach (string str in listStr)
                    {
                        count = int.Parse(str);
                        string typeName = mDataTable.Rows[count]["typeName"].ToString();
                        string callDateTime = mDataTable.Rows[count]["callDateTime"].ToString();
                        string callEndTime = mDataTable.Rows[count]["callEndTime"].ToString();
                        string aimNum = mDataTable.Rows[count]["aimNum"].ToString();
                        string getNum = mDataTable.Rows[count]["getNum"].ToString();
                        string getRate = mDataTable.Rows[count]["getRate"].ToString();
                        string succeedNum = mDataTable.Rows[count]["succeedNum"].ToString();
                        string succeedRate = mDataTable.Rows[count]["succeedRate"].ToString();
                        string daisNum = mDataTable.Rows[count]["daisNum"].ToString();
                        string allotNum = mDataTable.Rows[count]["allotNum"].ToString();
                        string remainNum = mDataTable.Rows[count]["remainNum"].ToString();

                        sw.WriteLine(string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}", n, typeName, callDateTime, callEndTime, aimNum, getNum, getRate, succeedNum, succeedRate, daisNum, allotNum, remainNum));
                        n++;
                    }
                }
            }

            sw.Flush();
            Response.Write(sb);
            Response.End();

1、导出附件另存时,直接打开附件时,标题为乱码2010-5-10%e7%bb%bc%e5%90%88%e6%是怎么回事啊?
2、导出的文件,当打开再保存时总是提示:csv可能含有与csv(逗号分隔)不兼容的的功能???

9 个解决方案

#1


csv文件格式:
1 回车换行分割记录
2 逗号分割字段
3 第一行可以是列名,也可以直接是数据
4 如果数据包括逗号,则需要使用双引号括起来,没有逗号也可以使用双引号括起来,不会错
5 如果数据使用双引号括起来,则如果数据本身包括双引号,这需要使用连续的两个双引号代替
结束,请按以上格式组织csv文件。

#2


Text.Encoding.UTF8 改成default 就好了。

#3


utf-8改成default

#4


引用 3 楼 changjin642 的回复:
utf-8改成default


不行的,直接打开时,文件名还是乱码。

#5



Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding.UTF8));
改成
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding。DEFAULT));
试试看

#6


引用 5 楼 andybang1981 的回复:
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding.UTF8));
改成
Response.AddHeader("Content-D……


不行的,楼上的已经说了

#7


up。。。

#8


up继续求救!

#9


直接写

System.Data.DataTable t = ds.Tables[0];
                
                try
                {
                    string fname2 = "d:\\a\\";
                    string fname1 = n + "_Profile";
                    string FileName = fname2 + fname1 + ".csv";

                    FileStream objFileStream;
                    StreamWriter objStreamWriter;
                    string strLine = "";
                    objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
                    objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);

                    //插入标题
                    for (int i = 0; i < t.Columns.Count; i++)
                    {
                        strLine = strLine + t.Columns[i].ColumnName.ToString() + Convert.ToChar(9);
                    }
                    objStreamWriter.WriteLine(strLine);
                    strLine = "";

                    //开始插入数据
                    for (int i = 0; i < t.Rows.Count; i++)
                    {
                        //string sss = t.Rows[i][0].ToString();
                        
                        //表格的自动编号strLine = strLine + (i+1) +Convert.ToChar(9);
                        for (int j = 0; j < t.Columns.Count; j++)
                        {
                            strLine = strLine + t.Rows[i][j].ToString() + Convert.ToChar(9);
                        }
                        objStreamWriter.WriteLine(strLine);
                        strLine = "";

#1


csv文件格式:
1 回车换行分割记录
2 逗号分割字段
3 第一行可以是列名,也可以直接是数据
4 如果数据包括逗号,则需要使用双引号括起来,没有逗号也可以使用双引号括起来,不会错
5 如果数据使用双引号括起来,则如果数据本身包括双引号,这需要使用连续的两个双引号代替
结束,请按以上格式组织csv文件。

#2


Text.Encoding.UTF8 改成default 就好了。

#3


utf-8改成default

#4


引用 3 楼 changjin642 的回复:
utf-8改成default


不行的,直接打开时,文件名还是乱码。

#5



Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding.UTF8));
改成
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding。DEFAULT));
试试看

#6


引用 5 楼 andybang1981 的回复:
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(filename.Replace(" ", "") + ".csv", System.Text.Encoding.UTF8));
改成
Response.AddHeader("Content-D……


不行的,楼上的已经说了

#7


up。。。

#8


up继续求救!

#9


直接写

System.Data.DataTable t = ds.Tables[0];
                
                try
                {
                    string fname2 = "d:\\a\\";
                    string fname1 = n + "_Profile";
                    string FileName = fname2 + fname1 + ".csv";

                    FileStream objFileStream;
                    StreamWriter objStreamWriter;
                    string strLine = "";
                    objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
                    objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);

                    //插入标题
                    for (int i = 0; i < t.Columns.Count; i++)
                    {
                        strLine = strLine + t.Columns[i].ColumnName.ToString() + Convert.ToChar(9);
                    }
                    objStreamWriter.WriteLine(strLine);
                    strLine = "";

                    //开始插入数据
                    for (int i = 0; i < t.Rows.Count; i++)
                    {
                        //string sss = t.Rows[i][0].ToString();
                        
                        //表格的自动编号strLine = strLine + (i+1) +Convert.ToChar(9);
                        for (int j = 0; j < t.Columns.Count; j++)
                        {
                            strLine = strLine + t.Rows[i][j].ToString() + Convert.ToChar(9);
                        }
                        objStreamWriter.WriteLine(strLine);
                        strLine = "";