使用Java POI在处理大型Excel文件时往往会面临读取速度慢的问题甚至可能导致内存溢出错误。这是因为POI默认将整个文件加载到内存中。本文将介绍两种主流优化方法有效提高大型Excel文件的读取效率。核心问题内存占用过高POI默认将整个Excel文件加载到内存中会导致内存占用过高严重影响读取速度甚至导致OutofmemoryEror。因此需要采用分段读取策略避免一次加载整个文件。优化方案方案1:使用xlsx-streamer库实现分段读取xlsx-基于POIstreamer通过分段缓存机制将数据分批加载到内存中显著减少了内存占用。在创建workbook对象时它使用streamingreader创建缓冲区并批量阅读文件内容。第一介绍xlsx-streamer和poi-ooxml依赖dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version${poi.version}/version /dependency dependency groupIdcom.monitorjbl/groupId artifactIdxlsx-streamer/artifactId version2.1.0/version /dependency如何使用xlsx-streamer阅读大型excel文件进行以下代码演示public static void readLargeExcel(File file) throws Exception { InputStream inputStream new FileInputStream(file); long start System.currentTimeMillis(); try (Workbook workbook StreamingReader.builder() .rowCacheSize(10000) // 缓存行数 .bufferSize(4096) // 缓冲区大小 .open(inputStream)) { Sheet sheet workbook.getSheetAt(0); log.info(Excel读取完成耗时{}毫秒, System.currentTimeMillis() - start); for (Row row : sheet) { System.out.println(读取第 row.getRowNum() 行数据); for (Cell cell : row) { System.out.print(cell.getStringCellValue() ); } System.out.println(); } System.out.println(读取结束行数 sheet.getLastRowNum()); } }在处理数十万行数据时这种方法可以显著缩短读取时间。方案二:使用EasyExcel库EasyExcel是阿里巴巴开源的高效Excel处理工具基于POI进行优化有效避免大文件读取内存溢出。它提供了简单的API便于读写操作。添加EasyExcel依赖dependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version3.1.0/version /dependency如何用EasyExcel读取Excel文件提供两种读取方式对象包装和Map读取public static void readExcelByEasyExcel(File file) { long start System.currentTimeMillis(); ListExcelData excelDataList EasyExcel.read(file).head(ExcelData.class).sheet(0).doReadSync(); excelDataList.forEach(System.out::println); log.info(完成Excel读取耗时{}毫秒, System.currentTimeMillis() - start); } public static void ExcereadExcelByEasyExcel1(File file) { long start System.currentTimeMillis(); ListMapString, Object listMap EasyExcel.read(file).sheet(0).doReadSync(); listMap.forEach(x - System.out.println(JSON.toJSONString(x))); log.info(完成Excel读取需要时间{}毫秒, System.currentTimeMillis() - start); }根据具体需要和项目环境选择哪种方案。xlsx-streamer侧重于POI增强EasyExcel提供更全面的功能和更友好的API。 根据实际情况选择最合适的方案。
Java POI读取大型Excel文件速度慢如何优化
发布时间:2026/6/24 8:30:52
使用Java POI在处理大型Excel文件时往往会面临读取速度慢的问题甚至可能导致内存溢出错误。这是因为POI默认将整个文件加载到内存中。本文将介绍两种主流优化方法有效提高大型Excel文件的读取效率。核心问题内存占用过高POI默认将整个Excel文件加载到内存中会导致内存占用过高严重影响读取速度甚至导致OutofmemoryEror。因此需要采用分段读取策略避免一次加载整个文件。优化方案方案1:使用xlsx-streamer库实现分段读取xlsx-基于POIstreamer通过分段缓存机制将数据分批加载到内存中显著减少了内存占用。在创建workbook对象时它使用streamingreader创建缓冲区并批量阅读文件内容。第一介绍xlsx-streamer和poi-ooxml依赖dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version${poi.version}/version /dependency dependency groupIdcom.monitorjbl/groupId artifactIdxlsx-streamer/artifactId version2.1.0/version /dependency如何使用xlsx-streamer阅读大型excel文件进行以下代码演示public static void readLargeExcel(File file) throws Exception { InputStream inputStream new FileInputStream(file); long start System.currentTimeMillis(); try (Workbook workbook StreamingReader.builder() .rowCacheSize(10000) // 缓存行数 .bufferSize(4096) // 缓冲区大小 .open(inputStream)) { Sheet sheet workbook.getSheetAt(0); log.info(Excel读取完成耗时{}毫秒, System.currentTimeMillis() - start); for (Row row : sheet) { System.out.println(读取第 row.getRowNum() 行数据); for (Cell cell : row) { System.out.print(cell.getStringCellValue() ); } System.out.println(); } System.out.println(读取结束行数 sheet.getLastRowNum()); } }在处理数十万行数据时这种方法可以显著缩短读取时间。方案二:使用EasyExcel库EasyExcel是阿里巴巴开源的高效Excel处理工具基于POI进行优化有效避免大文件读取内存溢出。它提供了简单的API便于读写操作。添加EasyExcel依赖dependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version3.1.0/version /dependency如何用EasyExcel读取Excel文件提供两种读取方式对象包装和Map读取public static void readExcelByEasyExcel(File file) { long start System.currentTimeMillis(); ListExcelData excelDataList EasyExcel.read(file).head(ExcelData.class).sheet(0).doReadSync(); excelDataList.forEach(System.out::println); log.info(完成Excel读取耗时{}毫秒, System.currentTimeMillis() - start); } public static void ExcereadExcelByEasyExcel1(File file) { long start System.currentTimeMillis(); ListMapString, Object listMap EasyExcel.read(file).sheet(0).doReadSync(); listMap.forEach(x - System.out.println(JSON.toJSONString(x))); log.info(完成Excel读取需要时间{}毫秒, System.currentTimeMillis() - start); }根据具体需要和项目环境选择哪种方案。xlsx-streamer侧重于POI增强EasyExcel提供更全面的功能和更友好的API。 根据实际情况选择最合适的方案。