Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按顺序读取xlsx文件_Java_Xlsx_Sequential_Memory Efficient - Fatal编程技术网

Java 如何按顺序读取xlsx文件

Java 如何按顺序读取xlsx文件,java,xlsx,sequential,memory-efficient,Java,Xlsx,Sequential,Memory Efficient,我有一个很大的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.p

我有一个很大的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("");
    }
}
你知道为什么这个代码效率这么低吗?或者您知道如何按顺序读取此代码,并以更少内存消耗的方式缓冲临时行吗?
提前感谢使用XSSF版本的Poi会导致内存问题。您可以使用流媒体,这将确保您不会耗尽内存

简而言之,使用这个替代方案

SXSSFWorkbook而不是XSSFWorkbook


API详细信息

您不应该将xlsx文件的任何内容打印到控制台,我也有这个问题。当您从xslx文件打印某些内容时,您永远不知道它的大小。这可能会占用大量内存。处理这些信息不应该是一项艰巨的任务problem@Casper字体我把所有的打印件都剪掉了,还是原样problem@J尤尔根克。奇怪的是,我也使用org.apache.poi.ss.usermodel,除了XSSFSheet和XSSFWorkbook之外,我只使用没有XSSF的Sheet和Workbook类。我从来没有遇到过大文件的问题,除非我在控制台上打印一些东西
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded