我有一个代码,用于将水印添加到现有的.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)
我今天收到了这个错误:“java.lang.NoSuchMethodError:org.apache.poi.util.POILogger.log(I [Ljava / lang / Object;)V]”
它看起来与您的错误不同,但非常相似。仅供参考,我正在使用maven来管理罐子。经过一些实验,我发现根案例是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>
宾果游戏,问题解决了。我希望这会帮助遇到这种异常的人。
见Apache POI FAQ entry on this very topic。几乎可以肯定的是,你已经在你的类路径中添加了一个新的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 Components Page来计算出你需要使用的Jars,以及它们的依赖关系。最后,将最新的罐子添加到您的类路径中,您将会很高兴!
您几乎肯定在类路径上有旧版本的POI。
去这里:http://poi.apache.org/download.html
下载tar.gz - >解压缩并从构建classPath中添加所有jar。
对齐'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>
我遇到了和你一样的问题,解决方案是你需要导入所有jar文件来运行你的程序。这些是运行你的项目所必需的
从一开始,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>
我有一个与apache Tika类似的问题(java.lang.NoSuchMethodError错误):javax.servlet.ServletException:java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.closeQuietly(Ljava / io / Closeable;)
我通过更新POI罐解决了这个问题。