java .lang.NoSuchMethodError: org. apache .poi.ss.usermodel.Cell.getCellType () I - PullRequest
0 голосов
/ 17 июня 2020

Прошу помощи. Я пытаюсь разобрать несколько файлов Excel и отправить данные в базу данных (Java 8). Я использую jxls, poi, postgre. Промежуточная цель - простой синтаксический анализ и вывод данных из файлов Excel на консоль. Ниже приведены небольшие фрагменты кода, который используется. При компиляции возникает ошибка:

java.lang.NoSuchMethodError: **org.apache.poi.ss.usermodel.Cell.getCellType()I**
-at org.jxls.reader.OffsetCellCheckImpl.readStringValue(OffsetCellCheckImpl.java:99)
-at org.jxls.reader.OffsetCellCheckImpl.getCellValue(OffsetCellCheckImpl.java:70)
-at org.jxls.reader.OffsetCellCheckImpl.isCheckSuccessful(OffsetCellCheckImpl.java:47)
-at org.jxls.reader.OffsetCellCheckImpl.isCheckSuccessful(OffsetCellCheckImpl.java:60)
-at org.jxls.reader.OffsetRowCheckImpl.isCheckSuccessful(OffsetRowCheckImpl.java:51)
-at org.jxls.reader.OffsetRowCheckImpl.isCheckSuccessful(OffsetRowCheckImpl.java:66)
-at org.jxls.reader.SimpleSectionCheck.isCheckSuccessful(SimpleSectionCheck.java:23)
-at org.jxls.reader.XLSForEachBlockReaderImpl.read(XLSForEachBlockReaderImpl.java:45)
-at org.jxls.reader.XLSSheetReaderImpl.read(XLSSheetReaderImpl.java:29)
-at org.jxls.reader.XLSReaderImpl.readSheet(XLSReaderImpl.java:65)
-at org.jxls.reader.XLSReaderImpl.readSheet(XLSReaderImpl.java:57)
-at org.jxls.reader.XLSReaderImpl.read(XLSReaderImpl.java:40)
-at Parser.getList(Parser.java:36)
-at ProjectActions.main(ProjectActions.java:86)

Класс парсера:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.jxls.reader.ReaderBuilder;
import org.jxls.reader.XLSReadStatus;
import org.jxls.reader.XLSReader;
import org.xml.sax.SAXException;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Parser {

    public List<App> getList(App app) {
        List<App> list = new ArrayList<>();
        try (
             InputStream inputXML = new BufferedInputStream(new FileInputStream(app.getXmlPath()));
             InputStream inputXLS = new BufferedInputStream(new FileInputStream(app.getExcelPath()))
            )
        {
            XLSReader mainReader = ReaderBuilder.buildFromXML(inputXML);
            Map beans = new HashMap();
            beans.put(app.getItems(), list);
            try {
                System.out.println(inputXML.toString());
                System.out.println(inputXLS.toString());
                XLSReadStatus readStatus = mainReader.read(inputXLS, beans);
            } catch (NoSuchMethodError e) {
                System.out.println("reading error");
                e.printStackTrace();
            }

        } catch (IOException | SAXException | InvalidFormatException e) {
            e.printStackTrace();
        }
        return list;
    }



    public List<List<String>> getListListString (List<App> list) {
        return new Converter().listAppConvertListListString(list);
    }

    public void printList(List<App> list) {
        System.out.println("============= START PRINTING LIST =============");
        for (App app : list) {
            System.out.println(app);
        }
    }

    public void printStringList(List<List<String>> list) {
        System.out.println("============= START PRINTING STRING LIST =============");
        for (List<String> line: list) {
            for (String element : line) {
                System.out.print(element + "\t");
            }
            System.out.println();
        }
    }
}

основной метод:

    public static void main(String args[]) throws Exception{
        App app = new App1();
        Parser parser = new Parser();
        parser.printStringList(parser.getListListString(parser.getList(app)));

    }

Также часть сервиса работает через чистый apache пои, в котором есть класс утилиты - DataUtil. С его помощью я без проблем прочитал другой файл ecxel - выше:

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;

import java.text.SimpleDateFormat;

public class DataUtil {
    public static String getCellText(Cell cell) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
        CellType ct = cell.getCellType();
//        System.out.println("ct = " + ct);
        String result = "";
        switch (ct) {
            case STRING:
                result = cell.getRichStringCellValue().getString();
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    result = sdf.format(cell.getDateCellValue());
                } else {
                    result = String.valueOf(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                result = String.valueOf( cell.getBooleanCellValue());
                break;
            case FORMULA:
                result = String.valueOf(cell.getNumericCellValue());
                break;
            default:
                break;
        }
        return result;
    }
}

Я пробовал везде ставить apache версию poi - 4.1.2, 4.1.1, 3.7, 3.6. Не помогает. Я попытался полностью очистить загруженные библиотеки и загрузить все с помощью maven. Не помогает. Пытался загрузить ВСЕ ВСЕ jar вручную. Не помогает. Подскажите пожалуйста, как решить эту проблему, потому что второй день пытаюсь решить и перечитываю кучу информации? Ничего не помогает. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 июня 2020

Если кто-то столкнется с такой же проблемой, то решение: http://jxls.sourceforge.net/changes.html То есть с Apache Poi (4.1.0) могут работать только версии Jxls не ниже 2.7.0. И, конечно же, все версии каждой зависимости должны быть одинаковыми.

0 голосов
/ 17 июня 2020

Я не совсем уверен если правильно понял. То есть вы хотите прочесть данные из каких то клеток Excel файла и потом принтовать их в консоль? Это так?

Не совсем уверен, правильно ли я понял. Вы хотите прочитать данные из некоторых ячеек файла Excel, а затем распечатать их в консоли? Это правильно?

В моем примере я использовал: org. apache .poi poi-oo xml 4.1.1

Вот как сделать то, что вы хотите:

/**
 * This class is used to extract data from excel then print it into the console
 */
public class extractingDataFromExcel {

    public static void main(String[] args) {
        //Path to your workbook excel file
        String pathToExcellFile = "./wbName.xlsx";

        //Name of the excel sheet. Warning: sheet must exist otherwise will throw an error.
        String sheetName = "Sheet1";

        //Row and column of the cell from which information will be extracted
        int row = 0;
        int column = 0;

        try {
            //Open excel file
            FileInputStream file = new FileInputStream(new File(pathToExcellFile));
            XSSFWorkbook workbook = new XSSFWorkbook(file);

            //Focus on a specific sheet from excel file
            XSSFSheet sheet = workbook.getSheet(sheetName);

            //Focus on a specific row
            XSSFRow rowhead = sheet.getRow(row);

            //Focus on a specific column and extract information from a cell as string
            String excelCellValue = rowhead.getCell(column).getStringCellValue();

            //Print excel cell value in the console
            System.out.println(excelCellValue);

            //Saving & closing excel file
            FileOutputStream fileOut = new FileOutputStream(pathToExcellFile);
            workbook.write(fileOut);
            fileOut.close();
            file.close();
            workbook.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
...