本文介绍了生成的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文件中的换行符快把我逼疯了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!