尝试读取.xlsm文件时出现java.lang.NoSuchMethodError

时间:2013-08-29 15:24:44

标签: java apache-poi xmlbeans xlsm

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveAggressiveNamespaces()Lorg/apache/xmlbeans/XmlOptions;
at org.apache.poi.POIXMLDocumentPart.<clinit>(POIXMLDocumentPart.java:56)
at rulebooksToExcel.GenerateExcel.generateExcel(GenerateExcel.java:34)
at rulebooksToExcel.ParseNortDocFiles.main(ParseNortDocFiles.java:165)

我收到错误:

workbook = new XSSFWorkbook(in);

我读了其他类似的问题,但他们都建议使用XMLBeans Version 2.0+。但我使用2.6,我找不到任何其他可能导致此问题的解释。

1 个答案:

答案 0 :(得分:0)

我遇到了Java8中的相同错误。

This接受的答案帮助了我

我在代码中添加了以下几行:

ClassLoader classloader = XmlOptions.class.getClassLoader();
        URL res = classloader.getResource(
                 "org/apache/xmlbeans/XmlOptions.class");
        String path = res.getPath();
        LOGGER.debug("XmlOptions.class loaded from " + path);

原来,如果您使用Java8 JRE 来运行您的应用程序,则会在日志中得到以下信息: 从文件:/ C:/Program%20Files/Java/jre1.8.0_131/lib/ext/xbean.jar!/org/apache/xmlbeans/XmlOptions.class

加载的XmlOptions.class

因此,在Java8中,无论您的类路径设置如何,JRE / lib / ext中都将首先加载一个apache xmlbeans jar!

当我将JAVA_HOME / PATH更改为指向已安装的JDK8时,问题已解决。

简短检查后,JRE7也是如此。 问题在于,在两种情况下,JRE捆绑的xbean.jar都包含XmlOptions :: setSaveAggresiveNamespaces(带有一个“ s”)。

(我使用的POI版本为3.17,因为该版本与Java7兼容。)

更新:事实证明,这在我的公司环境(已准备好的计算机/组策略)中是正确的,在我的PC上的家里没有这样的jar。