簡體   English   中英

java.lang.NoSuchMethodError:org.apache.poi.hssf.usermodel.HSSFSheet.setColumnWidth(II)V

[英]java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.setColumnWidth(II)V

我正在嘗試生成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();
            }
        }

我已經在我的lib中添加了poi-3.2-FINAL.jar文件,但仍然得到了上述異常

任何人都可以幫助我....

如果項目構建但在運行時遇到此錯誤,則只能表示一件事:您正在使用不同的庫版本構建和運行。 您構建的版本具有此方法,而您運行的版本則沒有。 也可能在類路徑上有多個版本,並且首先加載了錯誤的版本。 我不知道你是如何構建項目的,但如果你正在使用某種依賴管理器,請分析重復POI版本的結構。 如果你沒有使用任何依賴管理器......那么......確保在構建和運行時手動匹配庫,但你真的應該切換到為你做這個的構建工具,以便Jasper可以自動拖入它取決於正確的版本。

重要的提示:
由於Jasper已經依賴於POI,因此您的項目沒有理由再次聲明該依賴關系。 它只是要求您現在看到的品種的麻煩。 您只需聲明對Jasper的依賴關系,並讓您的依賴管理器拖入正確版本的POI。 不知何故,即使在高級開發人員中,對依賴管理的基本誤解也很常見。

另一方面,如果您依賴的另一個庫也拖入不同版本的POI,您需要查找兩個第三方庫的兼容版本(以便它們需要相同的POI),或者明確地從中排除POI其中一個,交叉你的手指,希望最好的。

我剛剛在我的應用程序上修復了這個錯誤 升級到最新版本的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文件。 我已經堅持了一段時間,讓它終於工作感覺很好!

將Apache POI版本更新為最新版本(最新的穩定版本為3.11)。 版本3.2很老。 當前版本包含此setColumnWidth(int,int)方法,該方法在3.2版本中不存在

我用'poi-3.11.jar'和'jxls-reader-1.0.6.jar'改變了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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM