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

EPPlus: CSV to Excel - Result all in one line

使用 EPPlus 版本 4.5.3.3.

在 Linux 上导出 excel 文件时,我遇到了一个奇怪的问题

问题是,当生成 CSV 内容并使用该内容生成 excel 文件时,整个结果最终出现在 excel-sheet 的第一行(使用 Libre-Office 在 Ubuntu 上)。这只发生在 Linux 上(Ubuntu 和 Debian 测试),但不会发生在 Windows 上。另一件奇怪的事情是,当我不使用 CSV 内容生成 excel 文件,而是生成 collection 文件时,它确实可以正常工作。可悲的是,那样的话,就没有办法使用自定义 headers.

生成 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 上执行它,您会发现它运行良好。

我真的尝试了很多东西,还尝试将分隔符从 ; 更改为 ,,引入了 text-qualifier 等等,但似乎无法实现工作。

如有任何帮助,我们将不胜感激!

CreateCsv中的方法StringBuilder.AppendLine终止每一行
使用 OS 的默认行终止符打开:

  • Windows \r\n
  • Unix \n

EPPlus 不遵守 OS 的默认行终止符并使用 \r\n 作为默认值。
这就是它适用于 Windows 的原因。

因此您可以将 ExcelTextFormat.EOL 属性 设置为 Environment.NewLine 以使用 OS.

的默认行终止符
var format = new ExcelTextFormat
{
    DataTypes = new[]
    {
        eDataTypes.String, eDataTypes.String
    },
    Delimiter = Delimiter.First(),
    Encoding = new UTF8Encoding(),
    EOL = Environment.NewLine
};