Получите данные каждой ячейки из Excel, преобразованные в XML для сохранения в БД

После поиска некоторых ресурсов я смог загрузить файл Excel, содержащий данные 1 000 000 строк. Но я не знал, как получить все данные. Вот мой код до сих пор...

public void create(MultipartFile file) throws Exception {
    try {
        InputStream fileStream = new BufferedInputStream(file.getInputStream());
        OPCPackage opc = OPCPackage.open(fileStream);
        XSSFReader xssf = new XSSFReader(opc);
        SharedStringsTable sst = xssf.getSharedStringsTable();
        XSSFReader.SheetIterator itr = (XSSFReader.SheetIterator)xssf.getSheetData();

// I just realize, if I running below for-loop,
// this only print strings and in random order, not in the same order as the excel file.
// 20 is just an example

        for (int i = 0; i < 20; i++) {
            System.out.println(sst.getEntryAt(i).getT().toString());
        }

        while (itr.hasNext()) {
            InputStream is = itr.next();
            if (itr.getSheetName().equals("MY_SHEET_NAME")) {
                while ("data is avaiable, this is just example, I'll use something like hasNext() for the row in the sheet, but I dont know how to do it" != null) {
                    // Want to process and get all data in each cells, then store to DB
                    // What I did not know, is how to get data in each cells
                }
            } else {
                throw new Exception("Sheet not found");
            }
        }
    } catch (Exception e) {
        throw new Exception("Error is: " + e.getMessage());
    } finally {
        if (is != null) {
            is.close();
        }

        if (opc != null){
            opc.close();
        }

        if (fileStream != null) {
            fileStream.close();
        }
    }
}

Я пытался посмотреть здесь для обработки листа, но я не понял, как получить данные в каждой ячейке. Любая помощь действительно поможет мне ..

Обновить

если я прочитаю документ POI apache, здесь, по ссылке, часть кода, которая будет обрабатывать мой excel, находится здесь:

public void processOneSheet(String filename) throws Exception {
        OPCPackage pkg = OPCPackage.open(filename);
        XSSFReader r = new XSSFReader( pkg );
        SharedStringsTable sst = r.getSharedStringsTable();

        XMLReader parser = fetchSheetParser(sst);

        // To look up the Sheet Name / Sheet Order / rID,
        //  you need to process the core Workbook stream.
        // Normally it's of the form rId# or rSheet#
        InputStream sheet2 = r.getSheet("rId2");
        InputSource sheetSource = new InputSource(sheet2);
        parser.parse(sheetSource);
        sheet2.close();
    }

Но как после вызова parser.parse(sheetSource) получить данные из каждой строки и столбца? Потому что я хочу выполнить проверку каждых данных в каждой ячейке, а затем сохранить их в базе данных.

Обновление 2. Я попытался использовать этот ответ, https://stackoverflow.com/a/51818500/10454516. . Я мог получить данные, я пытался вставить myObjectRepo.save(результат) или myObjectRepo.save(myObject), оба я поместил код внутри метода void endRow, а также попытался разместить его сразу после переключателя, но внутри if( lineNumber > 0), но всегда возвращает NullPointerException. Но если я не вызывал метод сохранения, я пытаюсь вывести результат в консоль, результат печатается.


person Akza    schedule 03.12.2018    source источник
comment
github.com/pjfanning/poi-shared-strings-sample содержит работающий версия образца XLSX2CSV от POI, который использует потоковые данные для создания CSV.   -  person PJ Fanning    schedule 04.12.2018
comment
github.com/monitorjbl/excel-streaming-reader также передает вход xlsx, но его вероятно, проще в использовании, чем подход парсера SAX.   -  person PJ Fanning    schedule 04.12.2018


Ответы (2)


Один из способов получить данные Excel:

try {
        InputStream excelFile = new FileInputStream(mFileName); 
        XSSFWorkbook wb = new XSSFWorkbook(excelFile);
        XSSFSheet sheet = wb.getSheetAt(0);
        XSSFRow row;
        XSSFCell cell;

        Iterator<Row> rows = sheet.rowIterator();

        int col = 0, colPR = 1;
        int pageRank = 0;
        String url = null;

        while (rows.hasNext()) {
            row = (XSSFRow) rows.next();
            url = row.getCell(col).getStringCellValue();

            System.out.println("--------------------------");
        }

        FileOutputStream out = new FileOutputStream(mFileName);
        wb.write(out);
        out.flush();
        out.close();
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
person Vebbie    schedule 03.12.2018
comment
Я пытался использовать XSSFWorkbook, но он занимает много памяти. Потому что мой файл excel будет содержать около 700 тыс. строк данных. Вот почему я не использовал XSSFWorkbook и использовал свой текущий подход - person Akza; 03.12.2018

Ну, я хотел бы ответить на свой вопрос. После нескольких экспериментов/испытаний, а также на основе этого ответа, я смог загрузить файл excel, содержащий не менее 1000 .000 данных строк и сохраняются в БД (postgresql). Для загрузки, чтения и вставки данных 1 000 000 строк требуется 5 минут. Вот ссылка на проект. Надеюсь, это может помочь любому, кто в этом нуждается.

person Akza    schedule 23.01.2019