NPOI写入XLS,但不写入XLSX

本文关键字:XLSX 写入 XLS NPOI | 更新日期: 2023-09-27 18:19:31

在这个问题上遇到了困难。。。

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

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();

需求发生了变化,新的Excel模板使用了XLSX的功能,因此现在是template.xlsx。我一直在使用NPOI2.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()));

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)

我可能做错了什么?

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

NPOI写入XLS,但不写入XLSX

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

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

  1. 嵌入到工作表中,以便工作表可以显示其他信息
  2. 所有这些都单独放在一张纸上。这就是所谓的图表

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

这给你留下了三个选择:

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