我正在尝试生成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文件,但仍然得到了上述异常
任何人都可以帮助我......
答案 0 :(得分:12)
如果项目构建但是在运行时遇到此错误,则只能表示一件事:您正在使用不同的库版本构建和运行。您构建的版本具有此方法,而您运行的版本不具备此方法。也可能在类路径上有多个版本,并且首先加载了错误的版本。我不知道您是如何构建项目的,但如果您正在使用某种依赖管理器,请分析重复POI版本的结构。如果你没有使用任何依赖管理器......那么......确保在构建和运行时手动匹配库,但你真的应该切换到为你做这个的构建工具,以便Jasper可以自动拖动在正确的版本,它取决于。
重要提示:
由于Jasper已经依赖于POI,因此您的项目没有理由再次声明该依赖关系。它只是要求你现在看到的品种有问题。您只需声明对Jasper的依赖关系,并让您的依赖管理器拖入正确版本的POI。不知何故,即使在高级开发人员中,对依赖管理的基本误解也很常见。
另一方面,如果您依赖的另一个库也拖入不同版本的POI,您需要查找两个第三方库的兼容版本(以便它们需要相同的POI),或者从他们中的一个人中排除POI,交叉你的手指并希望最好。
答案 1 :(得分:9)
我刚刚在我的应用程序上修复了这个错误。升级到最新版本的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文件。我已经坚持了一段时间,让它最终工作感觉很好!
答案 2 :(得分:0)
将您的Apache POI版本更新为最新版本(最新的稳定版本为3.11)。版本3.2很老。当前版本contains此setColumnWidth(int,int)方法在3.2版本中不存在
答案 3 :(得分:0)
我用'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>
答案 4 :(得分:0)
如果您使用的是 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>