【问题标题】:java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.setColumnWidth(II)Vjava.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.setColumnWidth(II)V
【发布时间】:2015-07-16 03:38:39
【问题描述】:

我正在尝试生成 Jasper Excel 报告。我遇到了类似

的异常
java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.setColumnWidth(II)V
at net.sf.jasperreports.engine.export.JRXlsExporter.setColumnWidth(JRXlsExporter.java:212)
at net.sf.jasperreports.engine.export.JRXlsAbstractExporter.setColumnWidths(JRXlsAbstractExporter.java:654)
at net.sf.jasperreports.engine.export.JRXlsAbstractExporter.exportPage(JRXlsAbstractExporter.java:527)
at net.sf.jasperreports.engine.export.JRXlsAbstractExporter.exportReportToStream(JRXlsAbstractExporter.java:423)
at net.sf.jasperreports.engine.export.JRXlsAbstractExporter.exportReport(JRXlsAbstractExporter.java:207)
at com.pagesolutions.controller.ReportingController.doGet(ReportingController.java:177)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

我的 Java 代码

if(formatType.matches("XLS")){
            String jrxml = "/home/madhu/report1.jrxml";
            list = (List<Reports>) session.getAttribute("customersList");
            //InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(jrxml);
            try {
                //jasperReport = JasperCompileManager.compileReport(jrxml);
                //jasperDesign = JRXmlLoader.load(jrxml);
                jasperReport = JasperCompileManager.compileReport(jrxml);
                JRDataSource datasource = new JRBeanCollectionDataSource(list, true);
                jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);
                String output="/home/madhu/reports/report.xls";
                //JasperExportManager.exportReportToPdfFile(jasperPrint, output);
                JRXlsExporter exporterXLS = new JRXlsExporter();
                exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
                exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
                exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
                exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
                exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
                exporterXLS.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, output);
                exporterXLS.exportReport();
                 ServletOutputStream servletOutputStream = response.getOutputStream();
                 String fileName = "report.xls";
                 FileInputStream fileToDownload = new FileInputStream(output);
                 response.setContentType("application/vnd.ms-excel");
                 response.setHeader("Content-Disposition", "attachment; filename="+ fileName);
                 ByteArrayOutputStream output1 = new ByteArrayOutputStream(); 
                 int readBytes = 0;
                 byte[] buffer = new byte[10000];
                 while ((readBytes = fileToDownload.read(buffer, 0, 10000)) != -1) {
                     servletOutputStream.write(buffer, 0, readBytes);
                 }

                 output1.flush();
                 output1.close();
                 fileToDownload.close();
            } catch (JRException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

我已经在我的库中添加了 poi-3.2-FINAL.jar 文件,但仍然出现上述异常

谁能帮帮我....

【问题讨论】:

  • 能否提供异常的完整堆栈跟踪?
  • 在我看来你用一个参数调用 setColumnWidth,而它需要两个参数。
  • 我给出了完整的堆栈跟踪,请检查
  • 您使用的是哪个版本的 Jasper 报告?似乎与使用的 POI 版本不兼容。
  • @Stultuske Madhu 的代码不是调用特定的方法,而是调用 Jasper Report Framework。

标签: java jasper-reports


【解决方案1】:

如果项目已构建,但您在运行时遇到此错误,这仅意味着一件事:您正在构建和运行不同的库版本。您构建的版本具有此方法,而您运行的版本没有。也可能发生您在类路径上有多个版本并且首先加载了错误的版本。我不知道您是如何构建项目的,但如果您使用某种依赖管理器,请分析重复 POI 版本的结构。如果您没有使用任何依赖项管理器...好吧...确保在构建和运行时手动匹配库,但您确实应该切换到为您执行此操作的构建工具,以便 Jasper 可以自动拖入它所依赖的正确版本。

重要提示:
由于 Jasper 已经依赖于 POI,因此您的项目没有理由再次声明该依赖关系。它只是在自找你现在看到的各种麻烦。您只需向 Jasper 声明您的依赖项,然后让您的依赖项管理器拖入正确版本的 POI。不知何故,即使在高级开发人员中,对依赖管理的基本误解也很普遍。

另一方面,如果您依赖的另一个库也拖入了不同版本的 POI,您需要找到两个第三方库的兼容版本(以便它们需要相同的 POI),或者明确​从其中一个中排除 POI,交叉手指并希望最好。

【讨论】:

  • @Madhu Maven、Ivy、Gradle、Ant 都是很棒的构建工具(还有更多...)。如果您使用它会有所帮助。
  • 他不编译 Jasper 报告代码,所以即使周围没有合适的 POI 版本也可以编译。
  • 我收到了类似的错误,因为一个版本的 jar 在我的项目的 lib 文件夹中,另一个在 pom 中声明导致版本“不匹配”。项目编译中没有显示错误,但正如受访者所说,它是在运行时。
【解决方案2】:

我刚刚在我的应用程序中修复了这个错误。升级到最新版本的 POI(撰写本文时为 3.15)是错误的做法。

从 Jasperreports 6.3.1 开始,它需要 Apache POI 3.10.1。我通过查看 Jasperreports 存储库 POM 文件发现了这一点,该文件位于此处: http://repo2.maven.org/maven2/net/sf/jasperreports/jasperreports/6.3.1/jasperreports-6.3.1.pom

如果您使用的是不同版本的 Jasper,只需在 URL 中更改为您的版本并检查 pom 文件。搜索 POI,它会告诉您需要什么版本。

当我从 POI 3.15 降级到 3.10.1 后,我的错误就消失了,我得到了一个可爱的 .xls 文件供我努力。我在这个问题上卡了一段时间,终于让它工作了感觉真好!

【讨论】:

  • 为什么还要重新声明对 POI 的依赖?对 Jasper 的依赖就足够了,Maven 会自己获得正确版本的 POI。通过重新声明依赖和更改版本,你只是在自找麻烦。
  • @kaqqao POI 是 Jasper 的可选依赖项。它不会自动导入。 mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/… 另外,我不会更改版本,我会确保匹配 Jasper 期望的版本。
  • @ScottM 我明白了。那么是的,您需要重新声明它,但要匹配版本。
  • 真的很有帮助。谢谢
【解决方案3】:

将您的 Apache POI 版本更新到最新版本(最新的稳定版本是 3.11)。 3.2 版很老了。当前版本contains 这个 setColumnWidth(int, int) 方法在 3.2 版本中是没有的

【讨论】:

  • OP 的项目仅传递依赖于 POI。更新 POI 只会增加不兼容的可能性。
【解决方案4】:

我已将 jar 更改为 'poi-3.11.jar' 和 'jxls-reader-1.0.6.jar'

    <dependency>
        <groupId>net.sf.jxls</groupId>
        <artifactId>jxls-core</artifactId>
        <version>1.0.6</version>
    </dependency>
    <dependency>
        <groupId>net.sf.jxls</groupId>
        <artifactId>jxls-reader</artifactId>
        <version>1.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>ooxml-schemas</artifactId>
        <version>1.4</version>
    </dependency>

and added dependency `3.11` 

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

【讨论】:

    【解决方案5】:

    如果您使用的是 JasperReports 6.x.x,请将 apache poi jar 版本升级到 4.1.2。我正在使用 JasperReports 6.13.0 版本,这已为我解决。

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

    如果您使用的是 JasperReports 5.x.x 版本,请使用 apache poi 3.11 的稳定版本。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 2018-08-15
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多