java.lang.NoSuchMethodError:org.apache.poi.xssf.usermodel.XSSFWorkbook。<init>(Ljava / io / InputStream;)V </init>

时间:2015-03-20 11:23:48

标签: java apache-poi import-from-excel

我已经在我的类路径中包含了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)

2 个答案:

答案 0 :(得分:1)

有一个Apache POI FAQ entry covering virtually this case,您应该阅读。基本上,在运行时,您没有使用您编译的POI jar。相反,你以某种方式使用不同的版本。这可能是因为您部署了不同的jar,可能是因为您的运行时或容器或框架运送了其他POI jar或其他一些错误。根据{{​​3}},所有POI罐子也必须来自同一版本。

所以,你需要在this POI FAQ的帮助下在运行时检查你的类路径,如果你不能发现什么是错的,那么删除不匹配的POI jar,这样你就只有你在编译时间。然后您的代码将起作用

然而......您的代码还有其他一些问题!一个是当你有一个文件时你正在使用InputStream。这个,snippet from the FAQ很糟糕,因为它使用了更多的内存。将其更改为使用文件,例如使用此

Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));

其次,Apache POI 3.9现在有点老了,而且有explained in the Apache POI docs,所以你应该升级到最新版本(写作时为3.11或3.12 beta 1)

答案 1 :(得分:0)

正如异常所示,即使您包含该方法所在的版本,构建也会考虑该方法不存在的旧版本。要测试它,请检查您的maven依赖关系树并删除旧版本。也可能是旧版本也从容器中传出,因此请正确检查。