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

23 浏览
0 Comments

生成的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天的时间来解决这个看似简单的问题,但我无论如何都想不出如何解决它。我看到了许多关于此问题的帖子,但没有一种解决方案能够解决这个问题。

admin 更改状态以发布 2023年5月25日
0
0 Comments

步骤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();

0
0 Comments

对我来说这个方案奏效:

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 将无法正确打开该文件,因为它期望分隔符为分号而不是逗号。我认为这是没有办法解决的。

0