Java POI读取大型Excel文件速度慢如何优化?
2025-03-14 16:19:36
Java POI处理大型Excel文件效率优化策略
使用Java POI在处理大型Excel文件时,往往会面临读取速度慢的问题,甚至可能导致内存溢出错误。这是因为POI默认将整个文件加载到内存中。本文将介绍两种主流优化方法,有效提高大型Excel文件的读取效率。
核心问题:内存占用过高
POI默认将整个Excel文件加载到内存中,会导致内存占用过高,严重影响读取速度,甚至导致OutofmemoryEror。因此,需要采用分段读取策略,避免一次加载整个文件。
立即学习“Java免费学习笔记(深入);
优化方案:
方案1:使用xlsx-streamer库实现分段读取
xlsx-基于POI,streamer通过分段缓存机制将数据分批加载到内存中,显著减少了内存占用。在创建workbook对象时,它使用streamingreader创建缓冲区,并批量阅读文件内容。
第一,介绍xlsx-streamer和poi-ooxml依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>com.monitorjbl</groupId> <artifactId>xlsx-streamer</artifactId> <version>2.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> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.0</version> </dependency>
如何用EasyExcel读取Excel文件,提供两种读取方式:对象包装和Map读取:
public static void readExcelByEasyExcel(File file) { long start = System.currentTimeMillis(); List<ExcelData> 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(); List<Map<String, 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文件的速度?详情请关注图灵教育的其他相关文章!
