4

当我试图实现以下任何代码时

File someFile = new File("D:\\arz.doc");
InputStream inputStrm = new FileInputStream(someFile);
HWPFDocument wordDoc = new HWPFDocument(inputStrm);
System.out.println(wordDoc.getText());

或者:

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("D:\\arz.doc"));
WordExtractor extractor = new WordExtractor(fs);
String wordText = extractor.getText();

,错误信息总是如下所示:

Exception in thread “main” java.lang.NoSuchMethodError:            
org.apache.poi.poifs.filesystem.POIFSFileSystem.getRoot()Lorg/apache/poi/poifs/filesystem/DirectoryNode;
at org.apache.poi.hwpf.HWPFDocument.(HWPFDocument.java:186)
at DB_connect.dissertation_araalz.ParseWodDocFile.main(ParseWodDocFile.java:29)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

你能帮我解决这个问题吗?

4

2 回答 2

11

您几乎可以肯定在您的类路径中有两个 POI 副本。一个是包含您要使用的功能的最新版本。另一个是旧版本,没有,而且您的系统似乎更喜欢旧版本......

这是一个很常见的问题,POI FAQ 涵盖了这种情况。理想情况下,只需查看您的类路径,并尝试识别更旧的 POI jar。但是,如果这不起作用,请尝试 POI FAQ 中的这段代码:

ClassLoader classloader =
   org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
         "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("Core POI came from " + path);

这将打印出您正在使用的 POI jar 的文件名,因此您可以确定旧副本的来源并删除它!

于 2012-07-11T09:43:28.943 回答
1

正如@Gagravarr 所指出的,尝试将所有 poi 库的版本更改为通用版本。我用同样的方法修好了。

于 2019-05-03T10:17:33.323 回答