EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理库,它通过简化 API 设计和优化性能,使得开发者可以更加高效地处理 Excel 文件。本文将详细介绍如何使用 EasyExcel 实现自动化报表生成的过程,包括基础概念、核心功能以及实际操作步骤。
EasyExcel 是一个轻量级的 Excel 操作工具,支持读取和写入 Excel 文件(支持 .xls
和 .xlsx
格式)。与传统的 Apache POI 相比,EasyExcel 在处理大数据量时具有显著的性能优势,因为它采用了 SAX 解析器进行数据读取,从而降低了内存占用。
在开始之前,请确保你的项目环境已配置好以下内容:
引入依赖
在 Maven 项目的 pom.xml
中添加 EasyExcel 的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
定义数据模型类
使用注解定义 Excel 表格中的列与 Java 对象字段的映射关系。例如:
import com.alibaba.excel.annotation.ExcelProperty;
import java.util.Date;
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty(value = "出生日期", format = "yyyy-MM-dd")
private Date birthday;
// Getter 和 Setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
EasyExcel 提供了简单的 API 来将数据写入 Excel 文件。以下是具体步骤:
示例代码如下:
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ExcelWriterExample {
public static void main(String[] args) {
// 准备数据
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25, new Date()));
userList.add(new User("李四", 30, new Date()));
// 写入 Excel 文件
String fileName = "users.xlsx";
EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);
System.out.println("Excel 文件生成成功!");
}
}
如果需要对表格进行样式调整,可以通过监听器实现。例如,设置单元格背景色或字体加粗:
import com.alibaba.excel.write.handler.WriteHandler;
import org.apache.poi.ss.usermodel.*;
import java.util.function.Consumer;
public class CustomCellStyleHandler implements WriteHandler {
@Override
public void sheet(int sheetNo, Sheet sheet) {
// 设置整个工作表的样式
}
@Override
public void row(int rowNum, Row row) {
// 设置每行的样式
for (Cell cell : row) {
Workbook workbook = row.getSheet().getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true); // 字体加粗
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
}
}
调用时传入自定义样式处理器:
EasyExcel.write(fileName, User.class)
.registerWriteHandler(new CustomCellStyleHandler())
.sheet("用户信息").doWrite(userList);
对于百万级以上的数据,建议使用分批写入以减少内存消耗。示例如下:
public class BatchExcelWriterExample {
public static void main(String[] args) {
String fileName = "large_data.xlsx";
EasyExcel.write(fileName, User.class)
.sheet("大数据量")
.doWrite(data -> {
// 模拟分批数据
List<User> batchData = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
batchData.add(new User("用户" + i, i, new Date()));
}
return batchData;
});
}
}
多 Sheet 生成
如果需要在一个 Excel 文件中生成多个工作表,可以多次调用 sheet()
方法:
EasyExcel.write(fileName, User.class)
.sheet("Sheet1").doWrite(list1)
.sheet("Sheet2").doWrite(list2);
复杂数据结构支持
EasyExcel 支持嵌套对象、集合等复杂数据结构的解析。例如:
public class Order {
@ExcelProperty("订单号")
private String orderNo;
@ExcelProperty(value = "商品列表", converter = GoodsConverter.class)
private List<Goods> goodsList;
}
性能优化建议
通过 EasyExcel,我们可以轻松实现 Excel 报表的自动化生成。无论是小规模数据还是大规模数据场景,EasyExcel 都能提供高效的解决方案。结合自定义样式和分批写入功能,能够满足企业级应用中的多样化需求。