Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NPOI写入XLS但不写入XLSX_C#_Asp.net_Excel_Apache Poi_Npoi - Fatal编程技术网

C# NPOI写入XLS但不写入XLSX

C# NPOI写入XLS但不写入XLSX,c#,asp.net,excel,apache-poi,npoi,C#,Asp.net,Excel,Apache Poi,Npoi,在这件事上有困难 使用XLS,一切都能100%正常工作(我在ASP.NET应用程序上使用NPOI): 需求发生了变化,新的Excel模板使用了XLSX的功能,因此现在是template.XLSX。我一直在使用NPOI2.0,我看到它支持XLSX(使用XSSF而不是HSSF)。我这样更改了代码(这里只显示了差异-其他所有内容都是一样的): 在workbook.Write(ms)行抛出异常: 我可能做错了什么 编辑:我尝试过NPOI 2.1.1测试版-同一版本我使用您的示例代码和一系列不同的XLSX

在这件事上有困难

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

需求发生了变化,新的Excel模板使用了XLSX的功能,因此现在是
template.XLSX
。我一直在使用NPOI2.0,我看到它支持XLSX(使用XSSF而不是HSSF)。我这样更改了代码(这里只显示了差异-其他所有内容都是一样的):

workbook.Write(ms)行抛出异常

我可能做错了什么


编辑:我尝试过NPOI 2.1.1测试版-同一版本

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

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

  • 嵌入到工作表中,以便工作表可以显示其他信息
  • 全部单独放在一张纸上。这就是我们所知道的
  • 您的XLSX模板似乎包含一个图表页,在尝试写出图表页时出错(
    XSSFChartSheet.write
    )。目前,NPOI有写XLSX图表的功能,它只是抛出一个异常

    这给您留下了三个选项:

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

  • 谢谢你花时间(你为什么这么做)。我考虑过ePlus,但这是一个很大的迁移。我目前的解决方法(狭条排印)是使用VBA和宏-我像最初一样使用XLS,然后运行宏,用我需要的XLS文件中的数据填充XLSX模板。无论如何,我都计划用NPOI填充工作内容。这似乎是个好机会我们决定坚持使用EPPlus.xssfc。我们将支持在NPOI 2.1.3.1中读/写,这只是因为EPPlus是用于商业用途的付费库
    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();
    
    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()));
    
    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)