JasperReports 5.2 不适用于 poi-3.7

Posted

技术标签:

【中文标题】JasperReports 5.2 不适用于 poi-3.7【英文标题】:JasperReports 5.2 is not working with poi-3.7 【发布时间】:2013-10-23 20:27:13 【问题描述】:

我在服务器 lib 文件夹中使用 JasperReports 5.2Apache poi 3.7。我在服务器库中没有任何其他版本的 poi。当我尝试生成 Excel 报告时,出现以下错误。

java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFWorkbook.getCreationHelper()Lorg/apache/poi/ss/usermodel/CreationHelper;

我可以通过下面的链接在这个 jar 文件中看到这个方法。

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/poi/3.7/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?av=f

【问题讨论】:

可能你在类路径中有多个版本的 poi 库。可能是您的服务器应用程序包含此库的另一个版本 JasperReports API 5.2 正在使用 org.apache.poi 3.7 @AlexK,我在服务器库中有不同 jar 名称的旧 poi jar 内容。我删除了它,现在我没有收到任何错误。 我已经发布了相关答案here 我已经发布了一个相关的答案here,对你有帮助。 【参考方案1】:

这是一个非常普遍的问题,the Apache POI FAQ has an entry for it,even includes code to work out what's wrong

基本上,在您的类路径的其他地方(可能来自您的服务器),有一个较旧的 Apache POI 副本。当您的代码运行时,它会触发类的加载,并且您的类加载器会毫无帮助地选择较旧的 jar,而不是较新的。

如果你run the code from the 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 的核心。我几乎可以保证它不会是你所期望的罐子......把旧的 POI 罐子(全部!),那么你应该很高兴。

嗯,大部分都很好。 Apache POI 3.7 is 3 years old 所以有很多fixes since then,值得考虑升级!

【讨论】:

我的服务器中有一个 jar 文件,名称不同,但 poi jar 内容旧。直到我运行了四行代码,我才意识到这一点。我删除了那个 jar 文件,jasper 5.2 正在使用 poi 3.7。谢谢!【参考方案2】:

您可以通过检查 Jasper 的相关 maven 存储库来查看相应的 apache poi 版本。

我碰巧在 Jasper 6.1:

http://repo2.maven.org/maven2/net/sf/jasperreports/jasperreports/6.1.0/jasperreports-6.1.0.pom

指向 apache poi 3.10.1。

如果版本不匹配,您可能会遇到各种奇怪的情况。是的,这个词是我编的。

【讨论】:

【参考方案3】:

我正在使用 iReport 5.5.0 和下面的 jar ...

poi-3.13.jar
jasperreports-5.0.4.jar
jackson-all-1.9.0.jar

而且效果很好……

【讨论】:

以上是关于JasperReports 5.2 不适用于 poi-3.7的主要内容,如果未能解决你的问题,请参考以下文章

CSS 不适用于 DOMPDF

引导弹出框不适用于 ng-repeat

我可以像D3.js一样使用JasperReports吗?

将作为整数输入的参数转换为 JasperReports 中的字符串

Summernote(数据未保存在数据库中)(laravel 5.2)

在升级laravel 5.2到5.3之后,无法在Route :: model中绑定模型