编写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处理依赖性问题的另一个项目中完成。