表格内容如下
分析
如图所示,这个excel表格共有4张sheet表,我们可以将四张表一起读取到,然后对单个sheet分别解析,之后演示以第一张sheet表为例。
代码实现
1.准备工作
1) 首先在pom.xml中引入easy excel 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
引入hutool工具包依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
2)引入监听器
public class EasyExcelListener extends AnalysisEventListener<Object> {
// 创建list集合封装最终的数据
private List<Object> list = new ArrayList<>();
// sheet页索引
private int sheetNo = 0;
@Override
public void invoke(Object t, AnalysisContext context) {
// 读取excle内容
int currentSheetNo = context.readSheetHolder().getSheetNo();
if (currentSheetNo != sheetNo) {
// 如果不根据sheet页索引更新状态重新创建list,list会反复添加前面的sheet页对象值
list = new ArrayList<>();
sheetNo = currentSheetNo;
}
list.add(t);
}
// 读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
}
// 读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
/**
* 获取表格内容(简单excel读取可用该方法)
*
* @param obj 需要转化的实体
* @param <T>
* @return
*/
public <T> List<T> getList(Class<T> obj) {
String jsonObj = JSONUtil.toJsonStr(list);
return JSONUtil.toList(jsonObj, obj);
}
/**
* 将表格转化为map集合(复杂excel读取用此方法)
*
* @return map集合
*/
public List<LinkedHashMap> getListMap() {
String jsonObj = JSONUtil.toJsonStr(list);
return JSONUtil.toList(jsonObj, LinkedHashMap.class);
}
}
关于使用LinkedHashMap存储的原因:因为当读取 Excel 文件内容时,如果我们不确定要映射到哪个具体的实体类,或者数据结构不固定时,LinkedHashMap是一种通用的存储方式
-
不确定接收实体:在处理 Excel 文件时,可能事先不知道每一列的数据将映射到哪个具体的对象字段。比如,文件结构可能是