我已经在我的类路径中包含了 dom4j-1-6.jar、poi 3.9 jar、poi ooxml schemas 3.9 jar、poi ooxml 3.9 jar、xmlbeans-2.3.0.jar。我使用了如下语法
InputStream ExcelFileToRead = new FileInputStream(relative+"/"+docName);
XSSFWorkbook wb_hssf = new XSSFWorkbook(ExcelFileToRead);
我收到以下错误,
java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(Ljava/io/InputStream;)V
at com.admin.upload_images.doPost(upload_images.java:1057)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
最佳答案
有一个 Apache POI FAQ entry covering virtually this case ,你应该阅读。但基本上,在运行时,您并没有使用您编译的 POI jar。相反,您以某种方式使用了不同的版本。这可能是因为您部署了不同的 jar,也可能是因为您的运行时、容器或框架传送了其他 POI jar,或者其他一些错误。根据this POI FAQ所有 POI jar 也必须来自同一版本。
因此,您需要在 snippet from the FAQ 的帮助下在运行时检查您的类路径如果您无法发现问题所在,请删除不匹配的 POI jar,这样您就只有在编译时使用的那些。然后你的代码就可以工作了
但是...您的代码还存在一些其他问题!其一是当你有一个文件时你正在使用一个InputStream。这如explained in the Apache POI docs很糟糕,因为它使用了更多内存。将其更改为使用文件,例如使用此
Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));
其次,Apache POI 3.9现在有点老了,已经有a huge number of bug fixes since then了,因此您应该升级到最新版本(截至撰写本文时为 3.11 或 3.12 beta 1)
关于java.lang.NoSuchMethodError : org. apache.poi.xssf.usermodel.XSSFWorkbook.<init>(Ljava/io/InputStream;)V,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29165392/