如何按顺序读取xlsx文件

时间:2017-06-27 08:29:31

标签: java xlsx sequential memory-efficient

我有一个大的xlsx文件(74 MB)。我找到了一种方法来阅读它。到目前为止,这是我的源代码。

import 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("");
    }
}

问题在于,即使使用交换和扩展JVM内存,我的8 GByte Ram似乎还不够。

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

你知道为什么这段代码效率低下吗?或者您可能知道如何顺序读取此代码并以较少的内存消耗方式缓冲临时行? 提前致谢

1 个答案:

答案 0 :(得分:0)

使用XSSF版本的Poi会导致内存问题。您可以使用流式替代方案,这将确保您不会耗尽内存。

简而言之,请使用此备选方案

SXSSFWorkbook而不是XSSFWorkbook

API详细信息here