0. 前言
曾经我们使用 Apache POI 或 JXL 来处理 excel,使用过的人都知道它们上手有多难,今天就让你见识一个简单的不能再简单的工具 - EasyExcel, 至少我认为它是真的简单。
1. 简介
官方网站:https://easyexcel.opensource.alibaba.com/
github地址:https://github.com/alibaba/easyexcel
gitee地址:https://gitee.com/easyexcel/easyexcel
感觉它的官方介绍,大概率是基于 poi 实现的,还没来得及及看源码,但是不重要,我们先用起来再说。
2. 读的使用
官方示例快速读:快速读
2.1 官方示例最简单读
/**
* 最简单的读
* <p>1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
* <p>3. 直接读即可
*/
@Test
public void simpleRead() {
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
2.2 我是怎么使用的
- 数据准备 SourceData 类, 对应 excel

public class SourceData {
private String id;
private String url;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
- 读取操作
/**
* 从 excel 文件中读取内容, fileName 是一个本地文件的路径
* SourceData 是我定义的一个与源 excel 文件表头对应的类,属性对应列名
*/
public List<SourceData> readExcel(String fileName) {
// 限定下读取所有内容的数量级,根据需求自行设定
List<SourceData> result = ListUtils.newArrayListWithExpectedSize(2000);
// 读取 excel 关键步骤,
EasyExcel.read(fileName, SourceData.class, new ReadListener<SourceData>() {
// 每次处理的数据级
private static final int BATCH_COUNT = 200;
// 每次处理临时存储集合
private List<SourceData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/**
* 每行读取完会调用
*/
@Override
public void invoke(SourceData data, AnalysisContext context) {
cachedDataList.add(data);
if (cachedDataList.size() >= BATCH_COUNT) {
// 根据自行需求业务处理,可以是后续的业务处理,我这里示例下打印输出
printData();
// 存储完成清理临时存储
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}
/**
* 每个sheet读取完会调用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 根据需求调用,这里只为演示
printData();
}
/**
* 打印输出
*/
private void printData() {
logger.info("当前记录 {} 条数据 ", cachedDataList.size());
logger.info("------打印每行结果------------");
for (SourceData sd : cachedDataList) {
logger.info("id= {} url= {}", sd.getId(), sd.getUrl());
}
// 这里将每次结果放入 result
result.addAll(cachedDataList);
}
}).sheet().doRead();
return result;
}
3. 写的使用
看起官方的示例有点乱,至少你先用起来
官方示例:快速写
3.1 我的使用
- 数据准备 RblData,
注解ExcelProperty是给列重命名,即 excel Sheet 表头,结果显示示例如下

public class RblData {
@ExcelProperty({"结构ID"})
private String id;
@ExcelProperty({"序号"})
private Integer number;
@ExcelProperty({"信用代码"})
private String creditCode;
@ExcelProperty({"名称"})
private String Name;
- 写操作
public static void writeExcel(List<RblData> listData) {
// mac 输出文件的地址,根据自行系统修改
String fileName = "/Users/test/output.xlsx";
// 指定写用哪个class去写,这里自定义的 RblData;然后写到 Sheet1,文件流会自动关闭
EasyExcel.write(fileName, RblData.class)
.sheet("Sheet1")
.doWrite(() -> {
// 分页查询数据
return listData;
});
}
4. 总结
总的说来,上手快,使用方便,还有更多的操作,可以参考下 API 的介绍,最最重要是要动起手来。如果你有问题欢迎一起交流下。
API: https://easyexcel.opensource.alibaba.com/docs/current/api/
常见问题:https://easyexcel.opensource.alibaba.com/qa/
另外:在我使用过程中,easyexcel 的版本更新后会有些 API 的废弃和更新,大家多注意下就可以了。
本文介绍了EasyExcel,一个简单易用的Java库用于处理Excel,包括读取和写入操作。作者通过实例展示了如何使用EasyExcel创建实体对象、设置监听器以及处理数据。同时提醒读者注意版本更新可能带来的API变化。
2万+

被折叠的 条评论
为什么被折叠?



