[在使用EPPlus版本4.5.3.3
的Linux上导出excel文件时,我遇到了一个奇怪的问题。
问题是,当生成CSV内容并使用该内容生成excel文件时,整个结果将最终显示在excel工作表的第一行(在Ubuntu上使用Libre-Office)。这只会在Linux(Ubuntu和Debian经过测试)上发生,而在Windows上不会发生。另一个奇怪的事情是,当我不使用CSV内容来生成excel文件,而是使用一个集合时,它确实可以正常工作。可悲的是,这样就无法使用自定义标头。
用于生成CSV的代码:
private static string GenerateCsv()
{
var header = $"{nameof(Menu.Main)}{Delimiter}{nameof(Menu.Desert)}";
var builder = new StringBuilder();
builder.AppendLine(header);
foreach (var menu in Menus)
{
var row = $"{menu.Main}{Delimiter}{menu.Desert}";
builder.AppendLine(row);
}
return builder.ToString();
}
用于生成Excel文件的代码:
var csv = GenerateCsv();
using var pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add("Sheet1");
var format = new ExcelTextFormat
{
DataTypes = new[]
{
eDataTypes.String, eDataTypes.String
},
Delimiter = Delimiter.First(),
Encoding = new UTF8Encoding(),
};
using var range = ws.Cells[1, 1];
range.LoadFromText(csv, format);
var bytes = pck.GetAsByteArray();
return this.File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "menus.xlsx", true);
可以从此github-repository克隆完整的样本。如果您在Windows上执行它,您会发现它工作正常。
[我确实做了很多事情,还尝试将定界符从;
更改为,
,引入了文本限定符,但没有,但似乎无法使它生效。
任何帮助将不胜感激!
StringBuilder.AppendLine
中的CreateCsv
方法终止每一行并使用操作系统的默认行终止符:
\r\n
\n
EPPlus不遵守操作系统的默认行终止符,而是使用\r\n
作为默认值。这就是为什么它可以在Windows上运行的原因。
因此您可以将ExcelTextFormat.EOL
属性设置为Environment.NewLine
以使用操作系统的默认行终止符。
var format = new ExcelTextFormat
{
DataTypes = new[]
{
eDataTypes.String, eDataTypes.String
},
Delimiter = Delimiter.First(),
Encoding = new UTF8Encoding(),
EOL = Environment.NewLine
};