java - org.apache.poi.POIXMLException 目前不支持严格的 OOXML,请参阅 bug #57699

标签 java excel apache-poi

我想用java解析Excel文件,所以我使用apache poi库,这里是maven依赖项:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.14</version>
</dependency>

这将包括一系列依赖项:

poi-ooxml-3.14.jar
poi-3.14.jar
commons-codec-1.10.jar
poi-ooxml-schemas-3.14.jar
xmlbeans-2.6.0.jar
stax-api-1.0.1.jar
curvesapi-1.03.jar

当我尝试使用以下代码读取 Office 365 Excel 文件 (.xslx) 时:

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelConverter {

    public static void main(String[] args) throws Exception{
        String excelFilePath = "C:/temp/Book1.xlsx";
        File myFile = new File(excelFilePath);
        System.out.println("File exists: " + myFile.exists());
        FileInputStream inputStream = new FileInputStream(myFile);

        Workbook workbook = new XSSFWorkbook(inputStream);
   }
}

我收到以下控制台消息:

File exists: true
Exception in thread "main" org.apache.poi.POIXMLException: Strict OOXML isn't currently supported, please see bug #57699
    at org.apache.poi.POIXMLDocumentPart.getPartFromOPCPackage(POIXMLDocumentPart.java:679)
    at org.apache.poi.POIXMLDocumentPart.<init>(POIXMLDocumentPart.java:122)
    at org.apache.poi.POIXMLDocumentPart.<init>(POIXMLDocumentPart.java:115)
    at org.apache.poi.POIXMLDocument.<init>(POIXMLDocument.java:61)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:273)
    at org.myCompany.excel.ExcelConverter.main(ExcelConverter.java:25)

你知道我可以做什么来解决这个问题吗? 提前致谢

最佳答案

除了“不要以“严格的 OOXML”格式保存电子表格”之外,目前似乎没有任何简单的解决方案。

例如,在 Excel 中使用

Save As --> "Excel Workbook (.xlsx)" 

而不是

Save As --> "Strict Open XML Spreadsheet (.xlsx)" 
<小时/>

Do you know why Excel Worksheet and this format have the same file extension?

这个问题只有微软才能回答。但我猜工程师(或他们的管理层)并没有预期应用软件有必要做出区分。

I am accepting Files as input and then processing them based on the extension. How can I know without try-catch?

没有任何东西可以让您使用当前一代 POI 处理文档。

我想您可以编写一些代码来读取文件并在将文件传递给 POI 之前查找“严格 OOXML”格式的签名1,但这没有多大意义。您将编写一堆额外的代码,以便可以用其他逻辑替换 try-catch。

<小时/>

1 - 请参阅 https://www.loc.gov/preservation/digital/formats/fdd/fdd000395.shtml#sign

关于java - org.apache.poi.POIXMLException 目前不支持严格的 OOXML,请参阅 bug #57699,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37749841/

相关文章:

objective-c - 在 Cocoa 中创建 Excel (.xlsx) 文件

java - Apache Poi,在一个单元格中插入具有不同 anchor 属性的 2 张图像

java - 如何确保作业仅运行一次/或仅由 5 个负载平衡器服务器之一运行

python - 如何使用 python-xlsxwriter 从 excel 文件的单元格中删除绿色箭头?

vba - Excel 中的 MsgBox 焦点

java - Apache-poi:想要遍历Excel列并对下一列中存在的相应值求和

java - 如何使用 Apache POI 从 Excel 工作表访问数据透视表中的单元格值?

java - 无法将 Android WebView 渲染为 C++ 和 Java 代码之间共享的外部纹理

java - 如何从批处理程序中检测java安装

java调用Web服务时出现错误403