我试图让工作成为一段代码来读取docx文件,但是由于一些奇怪的原因它失败了。
这条线失败了:
XWPFDocument document = new XWPFDocument(new FileInputStream(filepath));
堆栈追踪:
Exception in thread "main" java.lang.NoSuchMethodError: org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl.getTrList()Ljava/util/List;
at org.apache.poi.xwpf.usermodel.XWPFTable.<init>(XWPFTable.java:106)
at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:151)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:124)
at helper.JavaHelper.readTableDataFull(JavaHelper.java:84)
at helper.JavaHelper.main(JavaHelper.java:138)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
我有那些罐子:
看起来它应该对我有用(我也尝试过更新的poi libs - 同样的错误)。
有什么想法吗?
答案 0 :(得分:5)
快速查看Grepcode表示v1.1
ooxml-schemas
支持缺少的方法。此外,v1.0
似乎不包含此类方法(它只包含getTrArray()
方法)。
因此,您可能希望使用ooxml-schemas-1.1.jar
代替ooxml-schemas-1.0.jar
。
这是你应该至少使用的版本的maven依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
答案 1 :(得分:5)
问:我正在使用poi-ooxml-schemas jar,但我的代码失败了“java.lang.NoClassDefFoundError:org / openxmlformats / schemas / something ”强>
要使用新的OOXML文件格式,POI需要一个包含XMLBeans编译的文件格式XSD的jar。这些XSD一旦编译成Java类,就会存在于org.openxmlformats.schemas命名空间中。
有两个jar文件可用,如组件概述部分所述。所有模式的完整jar都是ooxml-schemas-1.1.jar,目前大约是15mb。较小的poi-ooxml-schemas jar只有4mb左右。后一个jar文件只包含通常使用的部分。
许多用户选择使用较小的poi-ooxml-schemas jar来节省空间。但是,poi-ooxml-schemas jar只包含通常使用的XSD和类,如单元测试所标识的那样。每隔一段时间,您可能会尝试使用未包含在最小poi-ooxml-schemas jar中的部分文件格式。在这种情况下,您应该切换到完整的ooxml-schemas-1.1.jar。从长远来看,您可能还希望提交一个新的单元测试,该测试使用XSD的额外部分,以便将来的poi-ooxml-schemas jar包含它们。
因此,正如常见问题解答所解释的那样,在短期内用较大的poi-ooxml-schemas
jar替换小ooxml-schemas
jar。从长远来看,向Apache POI提交一个junit测试,该测试使用你想要使用的模式jar的位,然后它们将从那时开始出现在下一个小poi-ooxml-schemas
jar中