当前位置: 首页 > 面试题库 >

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

都博裕
2023-03-14
问题内容

对于项目,我需要创建一个.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。

以下是[Content_Types].xml手工制作的.xlsx文件中的文件

<?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>

[Content_Types].xmlPOI创建的文件中包含以下内容时.xlsx

<?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处理依赖性问题。



 类似资料:
  • 我已经在中创建了工作簿/Excel。使用ApachePOIAPI成功实现了xlsx格式与Java的结合。我的代码如下,它是在D驱动器中创建的一个名为“RiponAlWasim.xlsx”的文件: 当我试图打开"RiPonAlWasim.xlsx"时,显示文件已损坏。怎么了?

  • 在我的Spring Boot1.4应用程序中,我使用JDBC与本地MySQL进行对话,使用了以下属性- null 所以,我的问题是,您将如何检测Spring Boot应用程序线程池中的JDBC连接池线程? 还有,属性配置有什么问题?为什么没有创建预期线程数的JDBC连接池?

  • 我正在使用ApachePOI,我创建了一个XSSF工作簿,并尝试打开一个xlsx文件。它在当地的一个地方很有效。但是,当我用Excel打开真正服务器(AWS EC2、Tomcat8、JDK 1.8)上的Excel文件时,它显示文件已损坏(.xls工作)。这是我的代码: 本地Spring4, jdk1.8, tomcat 8.0, maven 真正的AWS EC2亚马逊linux2,jdk1。8、t

  • 我有一段代码,目前正在写入一个

  • 我是JAVA新手。我需要将特定文件夹中的多个文件加载到excel xlsx(不是xls文件,因为输入文件有超过65k记录)文件的不同工作表中。下面是我编写的代码。xlsx文件损坏了,无法打开。你能帮忙吗? 4月27日编辑:工作代码,但存在性能问题。

  • 我使用XMLPowerols 2.2中的NormalizeXml函数对docx文档进行规范化,代码如下: 我的目标是搜索和替换变量,但变量并不总是在同一个“运行属性”中,因此不会被替换。我也不想禁用Office中的校对功能。 运行我的程序后,docx文件已损坏,在我尝试打开它时会抱怨样式(NormalizeXml函数无法工作或完成): 根据架构,XML数据无效。部分:/word/样式。xml,第1