17

我有一个用于将水印添加到现有 .doc 文件的代码。

以下是我到目前为止尝试过的代码

public static void main(String[] args)
{

    try
    {
        XWPFDocument xDoc = new XWPFDocument(new FileInputStream("test.doc"));
        XWPFHeaderFooterPolicy xFooter = new XWPFHeaderFooterPolicy(xDoc);
        xFooter.createWatermark("My Watermark");
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

以下是我得到的

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)V
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:50)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:71)
at com.avi.Test.ReadDoc.main(Watermark.java:38)
4

8 回答 8

34

我今天收到了这个错误:“java.lang.NoSuchMethodError:org.apache.poi.util.POILogger.log(I[Ljava/lang/Object;)V]”

它看起来与您的错误不同,但非常相似。仅供参考,我正在使用 Maven 来管理罐子。经过一番实验,我发现root case是poi.jar和poi-ooxml.jar的版本不一致。

这个配置会报错:

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.12</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.13</version>
    </dependency>

我将 poi.jar 的版本从 3.12 更改为 3.13

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.13</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.13</version>
    </dependency>

宾果游戏,问题解决了。我希望这会帮助遇到这种异常的人。

于 2016-03-02T09:46:39.413 回答
6

请参阅有关此主题的 Apache POI FAQ 条目。几乎可以肯定发生的事情是,您已将 POI 的新副本添加到类路径中,但旧版本已经存在(来自早期的需要、您的框架等),Java 现在对使用哪个版本感到困惑。

首先,您需要使用这样的代码片段来确定 POI 的来源:

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 组件页面来确定您需要使用哪些 Jars,以及它们的依赖项是什么。最后,将最新的 jars 添加到您的类路径中,一切顺利!

于 2013-08-14T12:52:39.823 回答
4

您几乎可以肯定在您的类路径中有旧版本的 POI。

请参阅Apache POI 常见问题解答

于 2013-08-14T12:19:09.270 回答
1

对齐“poi”和“poi-ooxml”的pom版本,它将完成工作

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
</dependencies>
于 2019-02-17T21:25:33.627 回答
1

去这里: http: //poi.apache.org/download.html

下载 tar.gz -> 解压并将其中的所有 jars 添加到 build classPath 中。

于 2016-02-02T12:25:21.893 回答
1

我对 apache Tika 有类似的问题(java.lang.NoSuchMethodError 错误): javax.servlet.ServletException: java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.closeQuietly(Ljava/io/Closeable;)

我通过更新 POI jar 解决了这个问题。

于 2019-05-28T13:40:18.063 回答
0

我遇到了和你一样的问题,解决方案是你需要导入所有 jar 文件来运行你的程序。这些是运行项目所必需的

  • Poi-3.10-Final.jar
  • Poi-ooxml-3.10-Final.jar
  • Poi-ooxml-schemas-3.10.jar
  • xmlbeans-2.30.jar
于 2014-03-20T16:22:05.873 回答
0

从一开始,poi-ooxml 和 poi 版本就必须一致。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version> <---------------this.
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version> <---------------this.
</dependency>
于 2018-01-09T00:41:42.173 回答