使用Apache POI XSSFWorkbook加载Excel文件耗时过长,求优化建议
Apache POI读取4MB Excel文件过慢的优化方案
升级Apache POI依赖版本
旧版本POI存在已知性能瓶颈,同步升级poi和poi-ooxml到最新稳定版(如5.2.5),避免版本不一致引发的兼容问题。正确使用XSSFReader流式解析
不要将整个工作簿加载到内存,仅流式处理需要的Sheet和单元格,跳过无关内容。示例代码:OPCPackage pkg = OPCPackage.open(blob.getBinaryStream()); XSSFReader reader = new XSSFReader(pkg); SharedStringsTable sst = reader.getSharedStringsTable(); XMLReader parser = XMLReaderFactory.createXMLReader(); parser.setContentHandler(new XSSFSheetXMLHandler(sst, null, new SheetContentsHandler() { @Override public void startRow(int rowNum) {} @Override public void endRow(int rowNum) {} @Override public void cell(String cellReference, String formattedValue) { // 仅处理业务需要的单元格数据 } }, false)); for (InputStream sheetStream : reader.getSheetsData()) { InputSource sheetSource = new InputSource(sheetStream); parser.parse(sheetSource); sheetStream.close(); } pkg.close();降低POI日志输出级别
若日志级别为DEBUG,POI会输出大量调试信息拖慢速度,将org.apache.poi相关日志级别调整为INFO或WARN。优化Blob流读取效率
部分数据库Blob实现读取性能较差,可先将Blob内容写入临时文件,再用POI读取文件流:File tempFile = File.createTempFile("excel_temp", ".xlsx"); try (OutputStream os = new FileOutputStream(tempFile)) { IOUtils.copy(blob.getBinaryStream(), os); } OPCPackage pkg = OPCPackage.open(tempFile); // 后续用流式方式处理文档关闭不必要的POI功能
若不需要公式计算、单元格样式解析,在解析时跳过这些模块,减少不必要的计算开销。调整JVM参数
适当分配堆内存(如-Xmx512m),避免频繁GC导致的执行卡顿,虽4MB文件内存压力不大,但可作为排查方向。
内容的提问来源于stack exchange,提问作者Anas Mansuri
相关产品推荐
相关产品推荐

