使用POI读取.xlsm时出现ExceptionInInitializerError

时间:2015-10-29 10:25:09

标签: java apache-poi

我将apache-poi包装在一个带有这些依赖关系的OSGI包中:

  • poi 3.13
  • poi-ooxml 3.13
  • poi-ooxml-schemas 3.13
  • xmlbeans 2.3.0

我尝试读取这样的.xlsm文件:

FileInputStream fis = new FileInputStream(file);
Workbook workbook = WorkbookFactory.create(fis);

但我得到了这个例外:

$ Exception in thread "JavaFX Application Thread" java.lang.ExceptionInInitializerError
    at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:162)
    at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:142)
    at org.apache.poi.openxml4j.opc.Package.<init>(Package.java:37)
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:88)
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:273)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:209)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:168)

我不知道我是否错过了依赖关系,或者我的代码是否错误。尝试了很多事情。

1 个答案:

答案 0 :(得分:1)

ExceptionInInitializerError通常表示其中一个加载的类中的某些静态代码块抛出了一个RuntimeException,它没有被捕获到任何地方,从而导致Java停止执行该Thread。

OPCPackage.java:162的情况下,类ZipPackagePropertiesMarshaller可能是第一次使用并因此被加载,这个加载PackagePropertiesMarshaller,它有一个处理XML初始化的静态代码块-Parser相关功能。

这表明您使用的JVM的版本/样式削弱了XML-Parsing支持或配置不正确。

请尝试使用最新的Oracle Java VM,看看是否会导致问题消失。

另一个可能的原因是,如果您包含一些其他第三方库,这些库会拖入其他一些完全不符合Java-XML接口的XML Parser,从而导致问题。尝试使用简化的测试应用程序来查看是否是这种情况。