我在Web服务器环境中也处于类似的情况。上传的典型大小约为 150k 行,从单个请求中消耗大量内存是不好的。Apache POI Streaming API对此非常有效,但它需要完全重新设计您的读取逻辑。我已经有一堆使用标准API的读取逻辑,我不想重做,所以我写了这个:https://github.com/monitorjbl/excel-streaming-reader
它并不完全是标准类的直接替代品,但如果您只是循环访问行,它的行为类似:XSSFWorkbook
import com.monitorjbl.xlsx.StreamingReader;
InputStream is = new FileInputStream(new File("/path/to/workbook.xlsx"));
StreamingReader reader = StreamingReader.builder()
.rowCacheSize(100) // number of rows to keep in memory (defaults to 10)
.bufferSize(4096) // buffer size to use when reading InputStream to file (defaults to 1024)
.sheetIndex(0) // index of sheet to use (defaults to 0)
.read(is); // InputStream or File for XLSX file (required)
for (Row r : reader) {
for (Cell c : r) {
System.out.println(c.getStringCellValue());
}
}
使用它有一些警告;由于XLSX工作表的结构方式,并非所有数据在流的当前窗口中都可用。但是,如果您只是尝试从单元格中读取简单数据,则效果很好。