编写XSSFWorkbook时,使用JDBC在Spring Boot应用程序中创建损坏的.xlsx文档

对于项目,我需要创建一个.xlsm excel文档,自动填写模板文件。 问题是,输出已损坏,Excel 365和Apache POI都无法读取。

我把它提炼到下面的最小例子,它可以在main方法中运行。 为了完全安全,它使用.xlsx格式。

 public static void main(String[] args) { XSSFWorkbook document = new XSSFWorkbook(); XSSFSheet spreadsheet = document.createSheet("Test"); spreadsheet.createRow(0).createCell(0).setCellValue("Testie test"); // Output .xlsx file FileOutputStream stream; try { stream = new FileOutputStream("test_output.xlsx"); document.write(stream); stream.flush(); stream.close(); } catch (IOException e) { System.err.println("Error" + e.getMessage()); e.printStackTrace(); } ... 

创建的文件test_output.xlsx无法由Excel 365打开并且大小仅为4kb,而手动创建的文件将占用9kb,因此输出中必须缺少某些我未指定的内容?

我正在使用通过Gradle导入的Apache POI版本3.17

 compile('org.apache.poi:poi-ooxml:3.17') 

并且还有Apache POI版本3.13以具有2016年之前的版本。在这两种情况下都没有运气。

当main方法扩展为也重新打开同一个文件时,刚刚创建,如下所示

  ... // Try to read it again try { document = new XSSFWorkbook("test_output.xlsx"); System.out.println(document.getSheetAt(0).getRow(0).getCell(0).getStringCellValue()); } catch (IOException e) { e.printStackTrace(); } } 

然后我最终遇到以下exception

 java.io.IOException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Can't read content types part ! at org.apache.poi.POIXMLDocument.openPackage(POIXMLDocument.java:91) at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:340) ... 

另一方面,如果所有XSSF*都替换为HSSF*并且文件类型被替换为.xls文件,那么输出的文档很好,但我需要创建一个有效的Excel 365文档,而不是Excel 2003文档。

以下是手动生成的.xlsx文档中的[Content_Types].xml文件

             

以下是POI创建的文件.xlsx中的[Content_Types].xml

            

基于@AxelRichter的建议,当在build.gradle中删除所有其他依赖项时,[Content_Types] .xml看起来如下所示。

            

上面的代码运行没有问题,文件可以在Office 365中打开。问题在于导入

 compile('com.oracle.jdbc:ojdbc8:12.2.0.1') 

这会在Apache POI使用的XML解析器的类路径中产生冲突,这意味着Excel部分需要在Gradle处理依赖性问题的另一个项目中完成。