生成的CSV文件中的换行符快把我逼疯了 [英] Line breaks in generated csv file driving me crazy

查看:192
本文介绍了生成的CSV文件中的换行符快把我逼疯了的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试导出我拥有的一些数据(存储在DataTable中)。其中一些值中有换行符。现在,每次我尝试将文件导入EXCEL(2010)时,换行符都会被识别为新行,而不是实际的换行符。

我找了几个小时,看了很多解决方案,但似乎就是修不好。

输出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();

当我用EXCEL手动打开它时,它显示得很好。但是因为EXCEL 2003不支持该文件格式,所以我必须导入它。使用导入时,它会看到换行符( 字段中)作为新行。

遗憾的是,我不能给您一个我使用的真实数据的示例(都是个人数据),但我可以给您一个它是如何出错的示例:

Header1,Header2,Header3
"value1","value2","value 3
and this is where its going wrong"

这是一个简单的CSV文件,当您导入它时,您将看到它在哪里出错。默认情况下,我使用双引号封装字段。默认情况下,我还从值中删除前导空格。

我在这个看似简单的问题上至少花了两天时间,但就我的一生而言,我想不出怎么才能解决它。我看过关于同一问题的多个主题,但那里提供的解决方案似乎都不能解决此问题。

推荐答案

我可以使用:

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);
    }

b)以八位位流发送,使用扩展名为.csv的文件名,并按照HTTP规范的要求将文件名引起来:

response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename="" + fileName + """);

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

我刚才检查了一下,Excel可以正确地打开这样的下载文件,包括带换行符的字段。

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

这篇关于生成的CSV文件中的换行符快把我逼疯了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆