easyExcel导入相关
- 首先要了解 easyExcel怎么获取表头 直接贴代码就不废话了
- 下面导入文件一块的代码
- 有的人说 如果我是不固定的表头怎么办呢?
首先要了解 easyExcel怎么获取表头 直接贴代码就不废话了
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Data;
import java.util.*;
@Data
public class AnalysisEventMonitor extends AnalysisEventListener<Map<Integer, String>> {
/**
* 存储Key
*/
Map<Integer, String> key = new HashMap<>();
/**
* keuList
*/
List<String> keyList=new ArrayList<>();
public AnalysisEventMonitor() {
}
/**
* 重写invokeHeadMap方法,获去表头,如果有需要获取第一行表头就重写这个方法,不需要则不需要重写
*
* @param headMap Excel每行解析的数据为Map<Integer, String>类型,Integer是Excel的列索引,String为Excel的单元格值
* @param context context能获取一些东西,比如context.readRowHolder().getRowIndex()为Excel的行索引,表头的行索引为0,0之后的都解析成数据
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
Set<Integer> integerSet = headMap.keySet();
for (Integer integer : integerSet) {
keyList.add(headMap.get(integer));
}
key.putAll(headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
}
}
这块代码就是用于easyExcel读取excel表格的时候拦截表头
类自己创建 继承AnalysisEventListener 就可以 然后重写她的invokeHeadMap方法就可以获取到excel 的一级表头了。
下面导入文件一块的代码
//加载拦截器 作用于 获取表头
AnalysisEventMonitor analysisEventMonitor = new AnalysisEventMonitor ();
//读取导入的excel 这个地方容易报错 0✖什么的 这个时候就去把excel的文件用高级版本的excel重新导出 因为版本过低的问题
List<Map<Integer,Object>> list = EasyExcel.read(file.getInputStream(),analysisEventMonitor ).sheet(0).doReadSync();
//获取拦截器拦截到的 表头的Map集合
Map<Integer, String> key = analysisEventMonitor .getKey();
现在 我们拿到了数据也拿到了表头。有的人就会好奇了,你只是获取了一级表头,那我二级表头怎么办? 别着急 听我慢慢说。
上方的代码块, 第二行获取了excel的数据 这个数据是去掉了一级表头之后的数据,说到这 可能有的人就懂了,有的人还是不懂 ok 我们继续说,第三行代码 是我们拦截器拦截的表头的集合 可以看出来 是以map接收的 map的key是一个Integer类型,欸 巧了,我们的数据 list 其中也包了个map而且 map的key 恰好也是Integer类型,这个时候逻辑性好的同学肯定想到了,这个integer 可不是瞎写瞎排序的 而是表头的位置与数据遥相呼应的。那这个时候就简单了,我们只需要找到多级表头的开始位置 即可 下面我会贴图 然后再做解答。
看到现在 成绩是合并了的 多级表头,这个时候 我们获取到的表头集合中的1对应姓名 2对应电话 3对应成绩 我们获取到的数据list,代码写 list.get(0); 这个获取到的数据 就是二级表头中的数据 这个时候又是拿到了一个map 对应关系分别是 1=null 2=null 3=英语 4=语文。 这个时候又有人说了 如果我后面再多一个多级表头怎么办? 贴图。
这个时候 我们获取到的表头数据中 1=姓名 2=电话 3=成绩 4=null 5=考核结果 获取到的list数据中 1=null 2=null 3=英语 4=语文 5=英语 6=语文
到此 多表头的导入就结束了,有的人还是不知道怎么把他存入数据库,那你就要想想了,最笨的方法就是记住下标 填充到实体类中,这个办法非常不推荐 不灵活! 最好办的办法就是用枚举 匹配 文字 再匹配字段 填充实体类 再或者 写个方法 将文字与字段对应上 自动转换实体类。
有的人说 如果我是不固定的表头怎么办呢?
那更简单了,不固定的表头 但是你不可能没有固定的列吧 如果没有固定的列 全部都是不固定的表头 那你就只能做两个表 一个表存字段名称的中文 一个表对应其中的数据,可以自己好好想想。如果是有固定的列 那你就获取固定列的文字 进行判断 然后再获取其中不固定的表头 将其填充。 授人以鱼不如授人以渔 凡事还是多动脑筋,办法已经教了 我也不可能面面俱到