java – XSSFWorkbook在编写时使用JDBC在Spring Boot应用程序中创建损坏的.xlsx文档
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – XSSFWorkbook在编写时使用JDBC在Spring Boot应用程序中创建损坏的.xlsx文档,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4632字,纯文字阅读大概需要7分钟。
内容图文
对于项目,我需要创建一个.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();
}
}
然后我最终遇到以下异常
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.<init>(XSSFWorkbook.java:340)
...
另一方面,如果将所有XSSF *替换为HSSF *并将文件类型替换为.xls文件,则输出的文档很好,但我需要创建一个有效的Excel 365文档,而不是Excel 2003文档.
以下是手动生成的.xlsx文档中的[Content_Types] .xml文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
<Default Extension="xml" ContentType="application/xml"/>
<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
<Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>
<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>
<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>
<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
</Types>
以下是POI创建的文件.xlsx中的[Content_Types] .xml
<?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ="rels"/>
<Default ="xml"/>
<Override ="/docProps/app.xml"/>
<Override ="/docProps/core.xml"/>
<Override ="/xl/sharedStrings.xml"/>
<Override ="/xl/styles.xml"/>
<Override ="/xl/workbook.xml"/>
<Override ="/xl/worksheets/sheet1.xml"/>
</Types>
解决方法:
根据@AxelRichter的建议,当在build.gradle中删除所有其他依赖项时,[Content_Types] .xml如下所示.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
<Default ContentType="application/xml" Extension="xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" PartName="/docProps/app.xml"/>
<Override ContentType="application/vnd.openxmlformats-package.core-properties+xml" PartName="/docProps/core.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" PartName="/xl/sharedStrings.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" PartName="/xl/styles.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" PartName="/xl/workbook.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" PartName="/xl/worksheets/sheet1.xml"/>
</Types>
上面的代码运行没有问题,文件可以在Office 365中打开.问题在于导入
compile('com.oracle.jdbc:ojdbc8:12.2.0.1')
这会在Apache POI使用的XML解析器的类路径中产生冲突,这意味着Excel部分需要在Gradle处理依赖性问题的另一个项目中完成.
内容总结
以上是互联网集市为您收集整理的java – XSSFWorkbook在编写时使用JDBC在Spring Boot应用程序中创建损坏的.xlsx文档全部内容,希望文章能够帮你解决java – XSSFWorkbook在编写时使用JDBC在Spring Boot应用程序中创建损坏的.xlsx文档所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。