我正在尝试导出一些我拥有的数据(存储在数据表中)。其中一些值中有换行符。现在,每次我尝试在 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 将无法正确打开文件,因为它需要使用分号而不是逗号作为分隔符。我认为对此无能为力。
第1步: 使用 ” ” 需要将文本值分解到下一行,如下所示。
字符串值=“我不怕练过一万种踢法的人, 但我害怕一个踢了一万遍的人。”;
第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();
我认为 CSV 字段中不能有换行符,因为换行符表示新记录。在将字段值添加到字符串之前,您可以替换字段值中的所有换行符吗?或者也许您可以构建一个 Excel 文件,它们应该允许在字段中换行。
包含 BOM 的 UTF 文件将导致 Excel 按字面意思处理新行,即使该字段被引号包围也是如此。 (已测试 Excel 2008 Mac)
解决方案是将任何新行设为回车符 (CHR 13) 而不是换行符。
我也有同样的问题。我在浏览此博客部分时找到了解决方案 - “以正确的格式导出到 Excel:”
我修改了我的代码如下:
string brstyle = @"<style>br { mso-data-placement:same-cell; }</style>";
Response.Write(brstyle);
Response.Write(stringWriter.ToString());
这对我有用。现在,带有换行符的文本出现在单个单元格中,而不是每个换行符出现在新单元格(行)中。