繁体   English   中英

java.lang.NoSuchMethodError:org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava / util / Iterator;

[英]java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;

我需要一些关于错误的帮助。 我有一个带有以下jar文件的javafx项目

  • fontawesome-FX-8.1.jar
  • sqlite的-JDBC-3.8.10.1.jar
  • controlsfx-8.40.11.jar
  • sqljdbc42.jar
  • jfoenix-1.0.0.jar
  • POI-3.17.jar
  • POI-例子-3.17.jar
  • POI-excelant-3.17.jar
  • POI-OOXML-3.17.jar
  • POI-OOXML-架构 - 3.17.jar
  • POI暂存器,3.17.jar

我需要的是导入一些excel数据。 我已经导入了上面的jar文件

但不幸的是,当我尝试运行该项目时,我收到错误:

Caused by: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;
at app.controllers.ContentAreaController.nextActionReport(ContentAreaController.java:734)
... 62 more

我试过谷歌搜索,建议我改变poi lib文件的版本,但没有运气。任何人都建议我的解决方案,因为我已经花了足够的时间在这个问题上

将一些注释推广到答案 - 您的类路径上有较旧的Apache POI jar。 根据此POI常见问题解答 - 不支持在版本之间混合POI jar

您需要做的就是删除旧的POI罐。 只是说,因为你不知道你有他们......幸运的是, 如果你按照这个Apache POI常见问题中的代码,它将帮助你找到旧罐子的来源 在有问题的系统上运行时,这样的东西应该打印出旧罐子的名称和位置:

ClassLoader classloader =
     org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
         "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("POI Core came from " + path);

classloader = org.apache.poi.POIXMLDocument.class.getClassLoader();
res = classloader.getResource("org/apache/poi/POIXMLDocument.class");
path = res.getPath();

System.out.println("POI OOXML came from " + path);

classloader = org.apache.poi.hslf.usermodel.HSLFSlideShow.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hslf/usermodel/HSLFSlideShow.class");
path = res.getPath();
System.out.println("POI Scratchpad came from " + path);

只需识别您不想要的旧罐子,移除,就应该设置好!

Gagravarr的回答https://stackoverflow.com/a/50472754/1497139指向http://poi.apache.org/help/faq.html#faq-N10006

我修改了使用JUnit Test的代码来修复相同的基本问题,并出现以下错误消息:

java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFCell.getCellTypeEnum()Lorg/apache/poi/ss/usermodel/CellType;

如果首先想到这是一个弃用问题。 在修复了弃用后我得到了:

java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFCell.getCellType()Lorg/apache/poi/ss/usermodel/CellType;

这是由于在同一个项目中混合使用Apache POI 3.12和Apache POI 4.0.1 jar。

为了避免将来这种情况,我创建了以下单元测试。 您可能希望根据需要调整版本,或者在仍然调试问题时跳过断言。

JUnit Test用于检查已使用类的POI版本。

  /**
   * get the path the given class was loaded from
   * 
   * @param clazz
   * @return the path
   */
  public String getClassLoaderPath(Class<?> clazz) {
    ClassLoader classloader = clazz.getClassLoader();
    String resource = clazz.getName().replaceAll("\\.", "/") + ".class";
    URL res = classloader.getResource(resource);
    String path = res.getPath();
    return path;
  }

  @Test
  public void testPOI() {
    Class<?>[] classes = {
        org.apache.poi.poifs.filesystem.POIFSFileSystem.class,
        org.apache.poi.ooxml.POIXMLDocument.class,
        org.apache.poi.hslf.usermodel.HSLFSlideShow.class,
        org.apache.poi.xssf.usermodel.XSSFCell.class,
        org.apache.poi.ss.usermodel.CellType.class};
    for (Class<?> clazz : classes) {
      String path = getClassLoaderPath(clazz);
      if (debug)
        System.out.println(
            String.format("%s came from %s", clazz.getSimpleName(), path));
      assertTrue(path.contains("4.0.1"));
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM