我使用 Apache POI 仅读取 Excel 文件第一张表中的数据。提交的 xlsx 文件通常只有 1 张,大约 2.5MB(数据行数略多于 13 万行),一切进展缓慢但顺利,没有错误。但是,如果提交的 xlsx 包含多个工作表,并且其他工作表中也包含大量数据,则执行会抛出 OutOfMemoryError: Java 堆空间错误。现在我试图弄清楚是否有可能总是只读取第一张纸上的数据而不用担心内存错误(我正在使用 -Xmx1024m -Xms512m 参数运行它)
编辑:这是我的代码
InputStream inputStream = new FileInputStream(new File(excelfile));
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
if (workbook.getNumberOfSheets() != 1) {
throw new Exception("Make sure excel only has 1 sheet");
}
程序在第二行抛出错误(如果 Excel 文件在第二张纸上也有大量数据)
Apache POI通常会触发很多与内存相关的问题,我强烈建议使用monitorjbs代替https://github.com/monitorjbl/excel-streaming-reader
InputStream is = new FileInputStream(new File(filePath));
Workbook workbook = StreamingReader.builder()
.rowCacheSize(100) // number of rows to keep in memory (defaults to 10)
.bufferSize(2048) // buffer size to use when reading InputStream to file (defaults to 1024)
.open(is)) {
Sheet sheet = workbook.getSheetAt(0);
您可以覆盖
parseSheet
以忽略不需要的工作表。
final String sheetName = "Sheet1";
XSSFWorkbook wb = new XSSFWorkbook(excelfile) {
@Override
public void parseSheet(java.util.Map<String, XSSFSheet> shIdMap, CTSheet ctSheet) {
if (sheetName.equals(ctSheet.getName())) {
super.parseSheet(shIdMap, ctSheet);
}
}
};