NPOI 2.1.3.1 生成损坏的 XLSX 文件
NPOI 2.1.3.1 produces corrupted XLSX files
我正在尝试使用 NPOI 2.1.3.1 从一些数据库数据创建一个 Excel 文件。但是,正在创建的文件已损坏。 Excel 拒绝打开它,将其更改为 ZIP 并尝试解压缩它也会导致 Windows 和 WinRAR 出错。我读过的其他线程说要升级到 2.1.3.1,因为它修复了一些关于 XLSX 创建的问题,但这根本不是真的。我也读过它与压缩文件的方式有关,但似乎没有任何控制它的能力。我希望有人能用我下面的代码为我指明正确的方向:
public byte[] GetExcelFile(
QueryModel query) {
var orders = Mapper.Map<IList<ExcelListModel>>(Context.Orders.Where(
o =>
o.DateOrdered >= query.Start
&& o.DateOrdered <= query.End));
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet();
for (int i0 = 0, l0 = orders.Count, r = 0; i0 < l0; i0++) {
var order = orders[i0];
for (int i1 = 0, l1 = order.Products.Count; i1 < l1; i1++, r++) {
var row = sheet.CreateRow(r);
var product = order.Products[i1];
row.CreateCell(0).SetCellValue("");
// ...
row.CreateCell(18).SetCellValue("");
}
for (int i1 = 0, l1 = order.Bonuses.Count; i1 < l1; i1++, r++) {
var row = sheet.CreateRow(r);
var bonus = order.Bonuses[i1];
row.CreateCell(0).SetCellValue("");
// ...
row.CreateCell(18).SetCellValue("");
}
}
var memoryStream = new MemoryStream();
workbook.Write(memoryStream);
return memoryStream.ToArray();
}
几个小时后,我认为 NPOI 没有实际问题。我已经切换到 EPPlus,它正在输出一个正确的临时文件,但发送回浏览器的文件仍然损坏。最终我得出结论,这是 ASP.NET MVC 的 FileResult
实现的问题,因为当我覆盖 Response
对象时,正确的文件被返回到浏览器。有关详细信息,请查看此 post:
不幸的是,当我切换到 EPPlus 时,我已经删除了 NPOI 代码,所以我无法 100% 准确地确认它没有真正被窃听。话虽这么说,基于我在 EPPlus 上获得的行为,我认为 NPOI 没有问题。
我正在尝试使用 NPOI 2.1.3.1 从一些数据库数据创建一个 Excel 文件。但是,正在创建的文件已损坏。 Excel 拒绝打开它,将其更改为 ZIP 并尝试解压缩它也会导致 Windows 和 WinRAR 出错。我读过的其他线程说要升级到 2.1.3.1,因为它修复了一些关于 XLSX 创建的问题,但这根本不是真的。我也读过它与压缩文件的方式有关,但似乎没有任何控制它的能力。我希望有人能用我下面的代码为我指明正确的方向:
public byte[] GetExcelFile(
QueryModel query) {
var orders = Mapper.Map<IList<ExcelListModel>>(Context.Orders.Where(
o =>
o.DateOrdered >= query.Start
&& o.DateOrdered <= query.End));
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet();
for (int i0 = 0, l0 = orders.Count, r = 0; i0 < l0; i0++) {
var order = orders[i0];
for (int i1 = 0, l1 = order.Products.Count; i1 < l1; i1++, r++) {
var row = sheet.CreateRow(r);
var product = order.Products[i1];
row.CreateCell(0).SetCellValue("");
// ...
row.CreateCell(18).SetCellValue("");
}
for (int i1 = 0, l1 = order.Bonuses.Count; i1 < l1; i1++, r++) {
var row = sheet.CreateRow(r);
var bonus = order.Bonuses[i1];
row.CreateCell(0).SetCellValue("");
// ...
row.CreateCell(18).SetCellValue("");
}
}
var memoryStream = new MemoryStream();
workbook.Write(memoryStream);
return memoryStream.ToArray();
}
几个小时后,我认为 NPOI 没有实际问题。我已经切换到 EPPlus,它正在输出一个正确的临时文件,但发送回浏览器的文件仍然损坏。最终我得出结论,这是 ASP.NET MVC 的 FileResult
实现的问题,因为当我覆盖 Response
对象时,正确的文件被返回到浏览器。有关详细信息,请查看此 post:
不幸的是,当我切换到 EPPlus 时,我已经删除了 NPOI 代码,所以我无法 100% 准确地确认它没有真正被窃听。话虽这么说,基于我在 EPPlus 上获得的行为,我认为 NPOI 没有问题。