🛠️ 使用 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 是高效且易用的选择!