NPOI写入XLS但不写XLSX

use*_*119 5 c# asp.net excel apache-poi npoi

与这个困难的时间......

使用XLS(我在我的ASP.NET应用程序上使用NPOI)一切都工作100%:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

private MemoryStream ms = new MemoryStream();
private IWorkbook workbook;
private ISheet worksheet;
private byte[] buffer;

using (FileStream file = new FileStream(@"C:\template.xls", FileMode.Open, FileAccess.Read))
{
    workbook = new HSSFWorkbook(file);
}

worksheet = workbook.GetSheetAt(0);
worksheet.GetRow(11).GetCell(11).SetCellValue("hello"); // etc etc etc

workbook.Write(ms);
buffer = ms.ToArray();

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.Clear();
response.AddHeader("Content-Type", "application/vnd.ms-excel");
response.AddHeader("Content-Disposition", String.Format("attachment; filename=template.xls; size={0}", buffer.Length.ToString()));
response.BinaryWrite(buffer);
response.End();
Run Code Online (Sandbox Code Playgroud)

需求已更改,新的Excel模板使用XLSX中的功能,现在就是这样template.xlsx.我一直在使用NPOI 2.0,我发现它支持XLSX(使用XSSF而不是HSSF).我改变了这样的代码(只显示了这里的差异 - 其他一切都是一样的):

using NPOI.XSSF.UserModel;

using (FileStream file = new FileStream(@"C:\template.xlsx", FileMode.Open, FileAccess.Read))
{
    workbook = new XSSFWorkbook(file);
}

response.AddHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.AddHeader("Content-Disposition", String.Format("attachment; filename=template.xlsx; size={0}", buffer.Length.ToString()));
Run Code Online (Sandbox Code Playgroud)

该行引发异常workbook.Write(ms);:

System.NotImplementedException: The method or operation is not implemented.
   at NPOI.XSSF.UserModel.XSSFChartSheet.Write(Stream out1)
   at NPOI.XSSF.UserModel.XSSFSheet.Commit()
   at NPOI.POIXMLDocumentPart.OnSave(List`1 alreadySaved)
   at NPOI.POIXMLDocumentPart.OnSave(List`1 alreadySaved)
   at NPOI.POIXMLDocument.Write(Stream stream)
Run Code Online (Sandbox Code Playgroud)

我可能做错了什么?

编辑:我已经尝试过NPOI 2.1.1 Beta - 同样的问题

Tan*_*hur 4

我使用您的示例代码和一堆不同的 XLSX 文件运行了一些测试。根据结果​​以及您得到的异常,问题不在于您的代码,而在于您正在使用的 NPOI 库和 XLSX 模板文件。

基本上,在 Excel 中,您可以通过两种方式显示图表:

  1. 嵌入工作表中,以便工作表可以显示其他信息。
  2. 全部单独在一张单独的表格中。这称为图表表

您的 XLSX 模板似乎包含图表工作表,并且在尝试写出图表工作表 ( XSSFChartSheet.Write) 时发生错误。目前,NPOI不支持编写 XLSX 图表表,它只是抛出异常。

这给您留下了三个选择:

  1. 从 XLSX 文件中删除所有图表工作表。
  2. 将模板中的所有图表工作表转换为嵌入图表。请注意,在我的测试中,NPOI 对嵌入式图表的支持有点不稳定。虽然在写出数据时不会引发异常,但生成的图表有时会在没有数据标签的地方添加数据标签,或者导致 Excel 通过删除图表本身来恢复文档。你的旅费可能会改变。
  3. 删除 NPOI 并使用其他一些库,例如EPPlus ,根据此答案,它似乎支持 XLSX 文件中的图表。