EasyExcel导出数据

🛠️ 使用 EasyExcel 4.0.3 高效导出海量数据

在日常开发中,我们经常需要将大量数据导出为 Excel 文件,比如报表、日志数据或数据分析结果。然而,使用传统的 Apache POI 导出大数据集时,容易出现内存溢出、导出速度慢等问题。

本文将使用 EasyExcel 4.0.3 演示如何高效导出百万级数据,并优化导出性能。


🔥 一、为什么选择 EasyExcel?

EasyExcel 的优势:

  • 轻量级:只依赖 com.alibaba:easyexcel,体积小。

  • 🚀 低内存消耗:采用流式写入,导出百万级数据不会导致内存溢出。

  • ⚙️ 支持大数据量导出:导出时采用分页查询,避免内存爆炸。


⚙️ 二、引入依赖

pom.xml 中引入 EasyExcel 4.0.3 依赖:


<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>4.0.3</version>
</dependency>

🚀 三、百万数据导出示例

假设我们从 MySQL 数据库中导出数据,每次分页查询 10 万条数据,写入 Excel。

1️⃣ 数据模型

创建 ExportData 类表示导出的数据对象:


import lombok.Data;
import com.alibaba.excel.annotation.ExcelProperty;

@Data
public class ExportData {

    @ExcelProperty(ID)
    private Long id;

    @ExcelProperty(名称)
    private String name;

    @ExcelProperty(创建时间)
    private String createTime;
}

2️⃣ 分页查询数据


import java.util.ArrayList;
import java.util.List;

public class DataService {

    public List<ExportData> getData(int page, int pageSize) {
        List<ExportData> list = new ArrayList<>();
        for (int i = 0; i < pageSize; i++) {
            ExportData data = new ExportData();
            data.setId((long) (page * pageSize + i));
            data.setName(用户_ + data.getId());
            data.setCreateTime(2025-03-19 12:00:00);
            list.add(data);
        }
        return list;
    }
}

3️⃣ 导出 Excel 文件


import com.alibaba.excel.EasyExcel;

import java.util.List;

public class ExcelExporter {

    public static void main(String[] args) {
        String filePath = export-data.xlsx;
        int pageSize = 100000;  // 每次导出 10 万条数据
        int total = 1000000;    // 总共导出 100 万条
        DataService service = new DataService();

        // 分页写入数据
        EasyExcel.write(filePath, ExportData.class)
                .autoCloseStream(true)
                .sheet(数据导出)
                .doWrite(() -> {
                    for (int i = 0; i < total / pageSize; i++) {
                        List<ExportData> data = service.getData(i, pageSize);
                        System.out.println(导出第  + (i + 1) +  页,数量: + data.size());
                        return data;
                    }
                    return null;
                });

        System.out.println(✅ 导出完成: + filePath);
    }
}

⚙️ 四、优化技巧

✅ 1️⃣ 避免内存溢出

在导出大数据时,避免一次性将所有数据加载到内存。采用 分页查询 + 分批写入

  • 使用 MySQL 分页查询,每次取 10 万条
  • 调用 EasyExcel.write() 方法流式写入

🚀 2️⃣ 并行导出

使用多线程加速导出:

  • 将导出任务拆分为多个线程
  • 并行处理不同的数据分页,提升速度

⚡️ 3️⃣ 导出多 Sheet

使用多 Sheet 将大数据分割到多个工作表中,防止 Excel 文件超限:


EasyExcel.write(multi-sheet.xlsx, ExportData.class)
        .sheet(Sheet1).doWrite(dataList1)
        .sheet(Sheet2).doWrite(dataList2);

🚀 五、总结

使用 EasyExcel 4.0.3 导出百万级数据:

  • ✅ 分页查询,防止内存溢出
  • 🚀 流式写入,提高导出效率
  • ⚡️ 并行处理,加速导出
  • 📊 多 Sheet 分隔,防止数据超限

🔥 如果你正在开发数据导出功能,EasyExcel 是高效且易用的选择!