首页 > 图灵资讯 > 技术篇>正文

Java POI读取大型Excel文件速度慢如何优化?

2025-03-14 16:19:36

java poi读取大型excel文件速度慢如何优化?

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文件的速度?详情请关注图灵教育的其他相关文章!

上一篇 Java如何将小写金额转换成大写金额并按位分割?
下一篇 返回列表

文章素材均来源于网络,如有侵权,请联系管理员删除。