生成的csv文件中的换行符让我疯狂。
生成的csv文件中的换行符让我疯狂。
我在尝试导出我有的一些数据(存储在数据表中)。其中一些值中有换行符。现在每次我尝试在Excel(2010)中导入文件时,换行符被识别为新行,而不是实际的换行符。
我已经搜索了几个小时,看到了许多解决方案,但我似乎就是无法解决它。
我输出CSV文件的方式:(变量csvfile是一个stringbuilder)
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不支持该文件格式,我必须导入它。在导入时,它将字段中的换行符( \\n)视为新行。
不幸的是,我无法向您展示我所使用的实际数据的示例(这是所有个人数据),但我可以向您展示它出了什么问题:
Header1,Header2,Header3 "value1","value2","value 3 and this is where its going wrong"
这是一个简单的CSV文件,导入后您将看到它出了什么问题。我默认用双引号包含字段。我也默认删除值中的前导空格。
我已经花了至少2天的时间来解决这个看似简单的问题,但我无论如何都想不出如何解决它。我看到了许多关于此问题的帖子,但没有一种解决方案能够解决这个问题。
步骤1:
在需要换行的文本值中使用“\n”,如下所示。
String value = "我不害怕练过一万脚的人, \n 而是害怕练了一脚一万次的人。";
步骤2:
使用扩展方法。它将检查文本索引以换行文本值。
public static class ExtensionMethods { static char[] SpecialCharacters = new char[] { ',', '"', '\r', '\n' }; public static string ToWrap(this string val) { StringBuilder builder = new StringBuilder(); bool firstColumn = true; // Add separator if this isn't the first value if (!firstColumn) builder.Append(','); // Implement special handling for values that contain comma or quote // Enclose in quotes and double up any double quotes if (val.IndexOfAny(SpecialCharacters) != -1) builder.AppendFormat("\"{0}\"", val.Replace("\"", "\"\"")); else builder.Append(val); firstColumn = false; return builder.ToString(); } }
步骤3:
创建扩展方法后,将扩展方法用于要包装文本值的字符串变量。
Value.ToWrap();
对我来说这个方案奏效:
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) 作为八位字节流(octet-stream)发送,使用 .csv 扩展名的文件名,并按照 HTTP 规范引用文件名:
response.ContentType = "application/octet-stream"; response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
c)对于所有字段都使用双引号
我刚刚检查到对我来说 Excel 正确地打开了这些文件,包括有换行符的字段。
但是请注意,在具有默认分隔符不同于“,”的所有系统上,Excel 仍将无法正确打开此类 CSV 文件。例如,如果用户在设置为德国地区设置的 Windows 系统上运行 Excel,则 Excel 将无法正确打开该文件,因为它期望分隔符为分号而不是逗号。我认为这是没有办法解决的。