EasyExcel使用详解

文章目录

EasyExcel使用详解

一、引言

EasyExcel 是阿里巴巴开源的一款基于 Java 的 Excel 处理工具,专注于高性能和低内存占用,尤其适合处理百万级数据的大文件。相比传统的 Apache POI,EasyExcel 通过流式读写和智能内存管理,显著降低了内存溢出风险,同时提供了简洁的 API 和灵活的注解配置。本文将从基础配置到实际应用场景,详解 EasyExcel 的核心功能。


二、环境准备与基础配置

1、添加依赖

pom.xml 中引入 EasyExcel 依赖(以最新稳定版为例):

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.0</version>
</dependency>

2、定义实体类

通过注解 @ExcelProperty 映射 Excel 列名或索引,@ExcelIgnore 忽略字段:

java 复制代码
@Data
public class User {
    @ExcelProperty("用户ID")
    private Long id;
    
    @ExcelProperty(value = "姓名", index = 1)  // 指定列索引
    private String name;
    
    @ExcelProperty("创建时间")
    private Date createTime;
    
    @ExcelIgnore  // 不参与读写
    private String remark;
}

三、Excel 读取详解

1、基础读取

使用 PageReadListener 实现分批处理(默认每 100 条处理一次):

java 复制代码
String fileName = "user_data.xlsx";
EasyExcel.read(fileName, User.class, new PageReadListener<User>(dataList -> {
    dataList.forEach(user -> System.out.println("读取数据:" + user.getName()));
})).sheet().doRead();

2、自定义监听器

实现 ReadListener 接口,手动控制数据批次:

java 复制代码
@Slf4j
public class UserListener implements ReadListener<User> {
    private static final int BATCH_SIZE = 200;
    private List<User> cachedList = new ArrayList<>(BATCH_SIZE);

    @Override
    public void invoke(User user, AnalysisContext context) {
        cachedList.add(user);
        if (cachedList.size() >= BATCH_SIZE) {
            saveToDatabase(cachedList);  // 模拟入库操作
            cachedList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if (!cachedList.isEmpty()) saveToDatabase(cachedList);
        log.info("所有数据解析完成!");
    }

    private void saveToDatabase(List<User> list) {
        // 实际业务中调用 DAO 层
    }
}

调用方式:

java 复制代码
EasyExcel.read(fileName, User.class, new UserListener()).sheet().doRead();

3、多 Sheet 处理

支持读取多个 Sheet,每个 Sheet 可绑定不同监听器:

java 复制代码
try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {
    ReadSheet sheet1 = EasyExcel.readSheet(0).head(User.class).registerReadListener(new UserListener()).build();
    ReadSheet sheet2 = EasyExcel.readSheet(1).head(Order.class).registerReadListener(new OrderListener()).build();
    excelReader.read(sheet1, sheet2);
}

四、Excel 写入详解

1、基础写入

直接写入数据列表,自动生成表头:

java 复制代码
List<User> userList = queryUsersFromDB();  // 从数据库查询数据
EasyExcel.write("export_users.xlsx", User.class)
    .sheet("用户列表")
    .doWrite(userList);

2、动态列与复杂表头

通过 @ExcelProperty 定义多级表头和列顺序:

java 复制代码
@Data
public class SaleData {
    @ExcelProperty({"销售信息", "订单号"})
    private String orderId;
    
    @ExcelProperty({"销售信息", "金额"})
    private BigDecimal amount;
    
    @ExcelProperty(value = "时间", index = 2)  // 指定列顺序
    private Date createTime;
}

3、样式与模板填充

支持基于模板的填充(如财务报表):

java 复制代码
// 填充模板中的占位符(如 {name})
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("amount", 10000);

EasyExcel.write("report.xlsx")
    .withTemplate("template.xlsx")
    .sheet()
    .doFill(data);

五、总结

EasyExcel 凭借其高性能低内存占用,成为处理大文件 Excel 的首选工具。通过灵活的注解配置和事件监听机制,开发者可以轻松实现复杂的数据映射和分批处理逻辑。无论是数据导入导出,还是模板化报表生成,EasyExcel 均能高效完成。


版权声明 :本博客内容为原创,转载请保留原文链接及作者信息。
参考文章

相关推荐
雷神乐乐10 天前
Java操作Excel导入导出——POI、Hutool、EasyExcel
java·开发语言·spring boot·poi·easyexcel·hutool
Hello Dam16 天前
基于 FastExcel 与消息队列高效生成及导入机构用户数据
java·数据库·spring boot·excel·easyexcel·fastexcel
啊烨疯狂学java25 天前
EasyExcel监听器详解
java·easyexcel
Tulipes1 个月前
Excel导出功能:vue2+SpringBoot
java·vue·excel·springboot·easyexcel
S-X-S1 个月前
EasyExcel(环境搭建以及常用写入操作)
java·开发语言·easyexcel
一只小小翠1 个月前
EasyExcel 模板+公式填充
java·easyexcel
谈谈的心情1 个月前
EasyExcel 动态设置表格的背景颜色和排列
java·easyexcel·导出表格
weixin_446707742 个月前
使用easyexcel导出复杂模板,同时使用bean,map,list填充
java·excel·easyexcel
pingzhuyan2 个月前
EasyExcel: 结合springboot实现表格导出入(单/多sheet), 全字段校验,批次等操作(全)
java·spring boot·servlet·threadlocal·easyexcel