java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.sheetIterator () Ljava / util / Iterator; - PullRequest
0 голосов
/ 22 мая 2018

пожалуйста, мне нужна помощь по ошибке.У меня есть проект javafx со следующими jar-файлами

  • 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-examples-3.17.jar
  • poi-excelant-3.17.jar
  • poi-ooxml-3.17.jar
  • poi-ooxml-schemas-3.17.jar
  • poi-scratchpad-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

Я пробовал поискать в Google, и я предлагаю изменить версию poi.lib файлы, но не повезло. Может кто-нибудь предложить мне решение, так как я потратил достаточно времени на проблему

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Ответ Гаграварра https://stackoverflow.com/a/50472754/1497139 указывает на http://poi.apache.org/help/faq.html#faq-N10006

Я изменил код для использования в тесте JUnit, чтобы устранить ту же самую базовую проблему со следующими сообщениями об ошибках:

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 в одном проекте.

Чтобы избежать этого в будущем, я создалследующий юнит тест.Возможно, вы захотите адаптировать версию к вашим потребностям или вообще пропустить утверждение, все еще отлаживая проблему.

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"));
    }
  }
0 голосов
/ 22 мая 2018

Продвижение некоторых комментариев к ответу - у вас есть старые файлы Apache POI в вашем classpath.В соответствии с этим FAQ по POI - смешивание банок POI между версиями не поддерживается

Что вам нужно сделать, это просто удалить старые фляги POI.Я говорю просто , так как вы не знали, что они у вас есть ... К счастью, если вы будете следовать коду в этом FAQ по Apache POI, это поможет вам найти, откуда берутся старые jar-файлы..Примерно так при запуске на проблемной системе следует распечатывать имена и местоположения старых jar-файлов:

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);

Просто определите старые jar-файлы, которые вам не нужны, удалите, и вы должны быть настроены!

...