我有一个控制器端点,我想从中生成 CSV 文件并下载它。
目前我正在使用 nuget CsvHelper,我的代码如下:
var cc = new CsvConfiguration(new System.Globalization.CultureInfo("sl-SI"));
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(stream: ms, encoding: new UTF8Encoding(true)))
{
using (var cw = new CsvWriter(sw, cc))
{
cw.WriteRecords(ListOfReports);
}// The stream gets flushed here.
return File(ms.ToArray(), "text/csv", $"{docNumber.Trim()}_{docType}.csv");
}
}
它生成的 CSV 非常好,但问题是,如果我在 Excel 中打开它,整行都在第一列中并且没有拆分。
我添加了这部分:
cw.WriteField("sep=,", false);
cw.NextRecord();
在
cw.WriteRecords(ListOfReports);
之前,它可以在 Excel 中使用,但如果我在记事本中打开它,则在我的第一行中有一个 sep=
。
我注意到
CultureInfo
存在差异,如果我设置 "sl-SI"
它将在斯洛文尼亚语窗口上正常工作(分隔符将是 ;),如果我设置“en-US”它将在英语 Windows 上正常工作(分隔符,),但是我需要做什么才能在任何文化上工作?
有谁知道如何解决这个问题,以便它可以在 Excel 和任何其他文本编辑器中正常工作?
这实际上与这个超级用户问题相同,但看来您想要一种面向编程的解决方案而不是面向用户的解决方案。
问题从根本上来说是 Excel 非常不擅长处理 CSV 文件,尤其是在考虑非美国文化时。我的建议是允许用户使用像 DocumentFormat.OpenXml.
这样的库下载真正的 Excel 文件。如果您有两个单独的下载用例(即一些用户在记事本中打开文件或使用读取 CSV 的软件使用文件,而其他用户则在 Excel 中打开文件),请为用户提供单独的选项以 CSV 或优秀。