尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError
Posted
技术标签:
【中文标题】尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError【英文标题】:java.lang.NoSuchMethodError when trying to read .xlsm file 【发布时间】:2013-08-29 15:24:43 【问题描述】: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 版本 2.0+。但我使用的是 2.6,我找不到任何其他解释可能导致此问题的原因。
【问题讨论】:
How to solve a NoSuchMethodError when using POI for doc files的可能重复 看起来您正在运行一个非常旧的 xmlbeans 副本...您可以尝试升级到受支持的版本 (2.3+) 并重试吗? @Gagravarr,正如我在问题中提到的,我使用的是 XMLBeans 2.6。 @BeginnerJava 根据POI FAQ,您是否确认您实际上使用的是正确版本的 POI jar? 您确定您使用的是您认为的 XMLBeans 版本吗?仅当您将 1.x 和 2.x 放在类路径中时,您才会认为您使用的是 2.x,但很可能您仍会使用 1.x! 【参考方案1】:我在 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 来运行您的应用程序,您会在日志中得到以下信息: XmlOptions.class 从文件加载:/C:/Program%20Files/Java/jre1.8.0_131/lib/ext/xbean.jar!/org/apache/xmlbeans/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。
【讨论】:
【参考方案2】:在应用服务器环境中,您的类路径中可能有旧版本的 xmlbeans(如 m4gic 所说)。
我运行该代码 sn-p 并看到 XmlOptions 正在从 Weblogic 模块加载;
XmlOptions.class loaded from file:/home/bea/bea12214/wlserver/modules/com.bea.core.xml.xmlbeans.jar!/org/apache/xmlbeans/XmlOptions.class
我通过强制 Weblogic 为 xmlbeans 使用应用程序包解决了这个问题。 (对于战争类型的部署,它位于 WEB-INF 文件夹下的 weblogic.xml 中)
<wls:prefer-application-packages>
...
<wls:package-name>org.apache.xmlbeans.*</wls:package-name>
</wls:prefer-application-packages>
【讨论】:
以上是关于尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError的主要内容,如果未能解决你的问题,请参考以下文章
尝试在映射服务器上将 XLSM 保存为 CSV 时出现“对象 _workbook 的方法保存失败”错误
为啥打开 .xlsm 而不是 .xls 时出现 python xlrd 错误
当我尝试在 Android 11 中读取文件时出现电容器文件系统错误