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 上执行它,您会发现它运行良好。
- 导出 CSV -> http://localhost:5000/api/v1/menus/csv(windows 和 linux 的结果很好)
- 使用 CSV 导出 excel 文件 -> http://localhost:5000/api/v1/menus/csv-to-excel(结果在 windows 上很好,但在 linux 上不行)
- 使用 collection -> http://localhost:5000/api/v1/menus/list-to-excel 导出 excel 文件(windows 和 linux 的结果很好)
我真的尝试了很多东西,还尝试将分隔符从 ;
更改为 ,
,引入了 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
};
使用 EPPlus 版本 4.5.3.3
.
问题是,当生成 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 上执行它,您会发现它运行良好。
- 导出 CSV -> http://localhost:5000/api/v1/menus/csv(windows 和 linux 的结果很好)
- 使用 CSV 导出 excel 文件 -> http://localhost:5000/api/v1/menus/csv-to-excel(结果在 windows 上很好,但在 linux 上不行)
- 使用 collection -> http://localhost:5000/api/v1/menus/list-to-excel 导出 excel 文件(windows 和 linux 的结果很好)
我真的尝试了很多东西,还尝试将分隔符从 ;
更改为 ,
,引入了 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
};