生成的csv文件中的换行符让我发疯

Mel*_*oud 9 c# csv excel-2010

我正在尝试导出一些数据(存储在数据表中).其中一些值中包含换行符.现在,每当我尝试在excel(2010)中导入文件时,linbreaks都会被识别为新行,而不是实际的换行符.

我搜索了几个小时,看到了很多解决方案,但我似乎无法解决它.

我输出我的csv文件的方式:(变量csvfile是一个字符串构建器)

context.Response.Clear();
context.Response.ContentType = "text/csv";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + name + ".csv");
context.Response.Write(csvfile.ToString());
context.Response.End();
Run Code Online (Sandbox Code Playgroud)

当我用excel手动打开它时,它显示正常.但是因为excel 2003不支持文件格式,所以我必须导入它.通过导入,它将换行符(字段中的\n)视为新行.

不幸的是,我不能给你一个我使用的真实数据的例子(它是所有的个人数据),但我可以给你一个如何出错的例子:

Header1,Header2,Header3
"value1","value2","value 3
and this is where its going wrong"
Run Code Online (Sandbox Code Playgroud)

这是一个简单的csv文件,当你导入它时,你会看到它出错的地方.我默认使用双引号封装字段.我也默认从值中删除前导空格.

我在这个看似简单的问题上花了至少2天,但对于我的生活,我无法弄清楚我是如何解决这个问题的.我在同一个问题上看过多个主题,但是那里提供的解决方案似乎都无法解决这个问题.

Ben*_*ehn 5

这对我有用:

a) 设置Response.ContentEncoding = System.Text.Encoding.UTF8不足以使 Excel 正确打开 UTF-8 文件。相反,您必须手动为 Excel 文件编写字节顺序标记 (BOM) 标头:

if (UseExcel2003Compatibility)
    {
        // write UTF-16 BOM, even though we export as utf-8. Wrong but *I think* the only thing Excel 2003 understands
        response.Write('\uFEFF');
    }
    else
    {
        // use the correct UTF-8 bom. Works in Excel 2008 and should be compatible to all other editors
        // capable of reading UTF-8 files
        byte[] bom = new byte[3];
        bom[0] = 0xEF;
        bom[1] = 0xBB;
        bom[2] = 0xBF;
        response.BinaryWrite(bom);
    }
Run Code Online (Sandbox Code Playgroud)

b) 作为八位字节流发送,使用带有 .csv 扩展名的文件名,并按照 HTTP 规范的要求引用文件名:

response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
Run Code Online (Sandbox Code Playgroud)

c) 对所有字段使用双引号

我刚刚检查过,对于我来说,Excel 可以正确打开这样的下载文件,包括带有换行符的字段。

但请注意,Excel 仍然无法在默认分隔符不同于“,”的所有系统上正确打开此类 CSV。例如,如果用户在设置为德语区域设置的 Windows 系统上运行 Excel,Excel 将无法正确打开文件,因为它需要分号而不是逗号作为分隔符。我认为对此无能为力。

  • 实际上是有的,但它是一个非常模糊的功能。您可以将其写为 csv 中的第一行: sep=,这将使 Excel 使用相同的分隔符,无论区域设置如何。 (7认同)