Как читать файлы xlsx последовательно

У меня большой файл xlsx (74 Мбайт). Я нашел способ прочитать его. Вот мой исходный код.

импорт java.io.File;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


private static void readXLSX(String path) throws IOException {
    File myFile = new File(path);
    FileInputStream fis = new FileInputStream(myFile);

    // Finds the workbook instance for XLSX file
    XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);

    // Return first sheet from the XLSX workbook
    XSSFSheet mySheet = myWorkBook.getSheetAt(0);

    // Get iterator to all the rows in current sheet
    Iterator<Row> rowIterator = mySheet.iterator();

    // Traversing over each row of XLSX file
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();

        // For each row, iterate through each columns
        Iterator<Cell> cellIterator = row.cellIterator();
        while (cellIterator.hasNext()) {

            Cell cell = cellIterator.next();

            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue() + "\t");
                break;
            case Cell.CELL_TYPE_NUMERIC:
                System.out.print(cell.getNumericCellValue() + "\t");
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.print(cell.getBooleanCellValue() + "\t");
                break;
            default :

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

Проблема в том, что мой 8-гигабайтный Ram не кажется достаточным, даже с использованием подкачки и расширения памяти JVM.

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

У вас есть идея, почему этот код неэффективен? Или, может быть, у вас есть идея, как последовательно читать этот код и буферизовать временные строки с меньшим объемом памяти? заранее спасибо

1 ответ

Известно, что использование Poi в XSSF вызывает проблемы с памятью. Вы можете использовать потоковую альтернативу, это гарантирует, что вам не хватит памяти.

Короче говоря, используйте эту альтернативу

SXSSFWorkbook вместо XSSFWorkbook

Подробности API здесь

Другие вопросы по тегам