繁体   English   中英

Apache POI工作簿引发java.lang.reflect.InvocationTargetException

[英]Apache POI Workbook throws java.lang.reflect.InvocationTargetException

我正在尝试使用以下代码实例化Workbook

Workbook workbook = WorkbookFactory.create(new File(excelWorkbookFilePath));

我这样做是因为工作簿可以是.xlsx.xls 但是,最终会引发以下错误:

Exception in thread "main" org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
    at org.apache.poi.POIXMLFactory.createDocumentPart(POIXMLFactory.java:65)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:601)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:174)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:249)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:293)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:252)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:231)
    at com.iconectiv.handle.ExcelHandle.<init>(ExcelHandle.java:43)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:56)
    at org.apache.poi.POIXMLFactory.createDocumentPart(POIXMLFactory.java:62)
    ... 9 more
Caused by: java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setLoadEntityBytesLimit(I)Lorg/apache/xmlbeans/XmlOptions;
    at org.apache.poi.POIXMLTypeLoader.<clinit>(POIXMLTypeLoader.java:50)
    at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:85)
    ... 15 more

我进行了一些研究,发现InvocationTargetException不是真正的异常,因此我尝试使用以下catch语句捕获它:

} catch (InvocationTargetException e) {
    e.getCause().printStackTrace();
}

但是,我在Eclipse中遇到一个错误,说我无法捕捉到它,因为它从不抛出任何东西。 为什么会出现此错误? 任何帮助将不胜感激,在此先感谢!

注意:我正在使用Apache POI 3.14。

引发的实际错误是NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setLoadEntityBytesLimit(I)Lorg/apache/xmlbeans/XmlOptions;

可能您的类路径中没有xmlbean jar,或者您可能有多个版本的jar

您可以根据文件名分别实例化.xls和.xlsx扩展名的工作簿:

Workbook wb = null;
    if (fileName.endsWith(".xlsx")) {
        wb = new XSSFWorkbook(in);
    }else{
        fs = new POIFSFileSystem(in);
        wb = (Workbook) new HSSFWorkbook(fs);   
    } 

我已经用相同版本更新了pom。 早些时候,我对poi-ooxml使用了不同的版本3.9.0,对于poi有4.0

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.0</version>
            </dependency>

对我有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM