NPOI写入XLS,但不写入XLSX

与这一个困难的时间…

一切工作100%与XLS(我在我的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的function,所以现在是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())); 

抛出的exception在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 – 同样的问题

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

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

  1. embedded工作表中,以便工作表可以显示其他信息。
  2. 所有本身在一个单独的表。 这就是所谓的图表 。

看来您的XLSX模板包含图表工作表,并试图写出图表( XSSFChartSheet.Write )时发生错误。 目前,NPOI 不支持写出XLSX图表,只是抛出exception。

这给你三个select:

  1. 从您的XLSX文件中删除所有图表。
  2. 将模板中的所有图表转换为embedded图表。 请注意,在我的testing中,NPOI对embedded式图表的支持有点不确定。 虽然它在写出时没有抛出exception,但是由此产生的图表有时会在没有数据标签的情况下添加数据标签,或者导致Excel通过删除图表本身来恢复文档。 你的旅费可能会改变。
  3. 删除NPOI,并使用一些其他库,例如, EPPlus似乎支持XLSX文件中的图表,基于这个答案 。