Как читать файлы 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 здесь