EPPlus:CSV到Excel-结果全部在一行中

问题描述 投票:1回答:1

[在使用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上执行它,您会发现它工作正常。

[我确实做了很多事情,还尝试将定界符从;更改为,,引入了文本限定符,但没有,但似乎无法使它生效。

任何帮助将不胜感激!

asp.net-core .net-core epplus
1个回答
0
投票

StringBuilder.AppendLine中的CreateCsv方法终止每一行并使用操作系统的默认行终止符:

  • Windows \r\n
  • Unix \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
};
© www.soinside.com 2019 - 2024. All rights reserved.