java 百万千万级别excel数据导出问题

针对Java在处理百万千万级别Excel数据导出时出现的慢速和内存溢出问题,提出了解决方案。建议使用分页读取数据并转换为CSV格式,分批写入文件,以避免一次性加载到内存。对于数据导入,推荐使用阿里EasyExcel的逐行读取模式,以提高性能和减少内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础:

  Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数量不大的应用场景。

 Alibaba EasyExcel采用逐行读取的解析模式,将每一行的解析结果以观察者模式通知处理(AnalyEventListener),所以比较适合数据体量较大的Excel文件解析。

当前问题:

        导出慢、OutOfMemoryError内存溢出

解决思路:

        使用批量写入或导出,不要一次性将数据读取到内存或一次性读写数据库

        导出:将数据分页读取,每次读取1万条数据,在读取数据的过程中,将数据转换成CSV格式,然后到了一定大小,就写入到CSV文件,这样就可以避免内存溢出。

        导入: Apache POI是直接一次性读取到内存, 所以建议使用阿里的EasyExcel,它是采用逐行读取模式

EasyExcel读取示例

EasyExcel.read("test.xlsx", Test.class,new AnalysisEventListener<Test>() {
    @Override
    public void invoke(Test test, AnalysisContext arg1) {
        // 读取每条数据
        orderList.add(order);
    }
 
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        // 读取到列头
        System.out.println(headMap);
    }
 
    @Override
    public void doAfterAllAnalysed(AnalysisContext arg0) {
        // 读取完毕
        System.out.println("END");
    }
}).sheet().doRead();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值