Java 如何按顺序读取xlsx文件
我有一个很大的xlsx文件(74兆字节)。我找到了一种读懂它的方法。这是到目前为止我的源代码 导入java.io.FileJava 如何按顺序读取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
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