将数据导出为 .csv 文件

3
我在将数据导出到.csv文件方面遇到了问题。我使用了两种方法。
        Encoding csvEncoding = new UTF8SignatureEncoding();
        byte[] csvFile = TestByte(CsvContentDelimiter.NewLine, CsvContentDelimiter.Semicolon, csvEncoding);


        string attachment = String.Format("attachment; filename={0}.csv", "docs_inv");

        Response.Clear();
        Response.ClearHeaders();
        Response.ClearContent();
        Response.ContentType = "text/csv";
        Response.ContentEncoding = csvEncoding;
        Response.AppendHeader("Content-Disposition", attachment);
        Response.BinaryWrite(csvFile);
        Response.Flush();
        Response.End();

并且
    public byte[] TestByte(CsvContentDelimiter rowDelimiter, CsvContentDelimiter columnDelimiter, Encoding encoding)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("product;");
        return encoding.GetBytes(sb.ToString());
    }

这段代码创建了一个.csv文件,但是该文件的编码有问题,我只能看到一些“哈希”符号。


你确定你看到了哈希值吗?难道你没有看到文件的十六进制版本吗?如果是这样,请尝试在其他文本编辑器(例如Notepad2)中打开它。 - sasjaq
我确定,我用Notepad++打开它。 - user1897865
尝试按照@Belogix的建议将BinaryWrite更改为Write。但如果可能的话,不要使用\r\n,而是使用string.Format("Record1,Fred,23{0}", Environment.NewLine)。 - sasjaq
Response.Write 没有帮助。我无法像这样写字符串:"Record1,Fred,23\r\nRecord2,Bob,36\r\n"。 - user1897865
另一个尝试的方法是创建一个新页面,并将我的示例代码发布到其中。也许那个特定页面有一些奇怪的问题? - Belogix
显示剩余8条评论
1个回答

2

这里是一个使用UTF8格式的完整工作示例。它使用您自己的代码,因此显示了编码是引起问题的根源:

namespace WebApplication1
{
    using System;
    using System.Text;

    public partial class _Default : System.Web.UI.Page
    {
        protected void btnExport_Click(object sender, EventArgs e)
        {
            // Use UTF8 encoding
            Encoding csvEncoding = Encoding.UTF8;
            byte[] csvFile = TestByte(csvEncoding);

            string attachment = String.Format("attachment; filename={0}.csv", "docs_inv");

            Response.Clear();
            Response.ClearHeaders();
            Response.ClearContent();
            Response.ContentType = "text/csv";
            Response.ContentEncoding = csvEncoding;
            Response.AppendHeader("Content-Disposition", attachment);
            Response.BinaryWrite(csvFile);
            Response.Flush();
            Response.End();
        }

        public byte[] TestByte(Encoding encoding)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("Record1,Fred,Bloggs,26{0}", Environment.NewLine);
            sb.AppendFormat("Record2,John,Smith,32{0}", Environment.NewLine);
            return encoding.GetBytes(sb.ToString());
        }
    }
}

可以使用 Response.Write(s1); 这行代码。 其中 s1 = "Record1,Fred,23\r\nRecord2,Bob,36\r\n"; - user1897865

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接