当前位置: 首页 > 知识库问答 >
问题:

NPOI写入XLS但不是XLSX

郜玉石
2023-03-14

在这件事上有困难。。。

使用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的功能,因此它现在是<代码>模板。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()));

在工作簿的第行抛出异常。写入(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测试版-同样的问题

共有1个答案

田信然
2023-03-14

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

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

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

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

这给您留下了三个选择:

  1. 从XLSX文件中删除所有图表表。
  2. 将模板中的所有图表工作表转换为嵌入式图表。请注意,在我的测试中,NPOI对嵌入式图表的支持有点不确定。虽然它在写入它们时没有引发异常,但生成的图表有时会在没有数据标签的地方添加数据标签,或者导致Excel通过删除图表本身来恢复文档。您的里程可能会有所不同。
  3. 根据这个答案,删除NPOI并使用其他一些库,例如EPPlus,它似乎支持XLSX文件中的图表。
 类似资料:
  • 我需要的是一种使用NPOI库打开.xls文件的方法。提前谢了。

  • 我有一段代码,目前正在写入一个

  • 问题内容: 我在JasperReports 4.1.1中找不到如何在.xlsx中导出文件。班上: 没有Xlsx等效项。而且我找不到参数来设置从xls到xlsx的输出格式。 问题答案: 该 JRXlsxExporter 类应该用于在出口 XLSX 格式。 在JasperReports 5.5.2之前的版本中使用导出器的示例 直到 JasperReports 5.5.1, 此代码可用于以 xlsx 格

  • NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。 NPOI由Neuzilla创建并维护,欢迎去领英关注Neuzilla

  • 我有保存在表中的数据(我已经从一个文件中收集了它),我想用java把它写在Excel xls文件中 我只共享主类,因为它显示了我如何将数据保存在表中

  • 我正在做一个程序,只修改文件Doc,xls,ppt和Vsd中的元数据(标准和自定义),程序可以正常工作,但我想知道是否有办法在不将整个文件加载到内存中的情况下执行此操作: POIFSFileSystem=new POIFSFileSystem(new FileInputStream("file.xls")) NPOIFSFileSystem方法速度更快,占用的内存更少,但它是只读的。 我使用的是A