Java easyExcel的复杂表头多级表头导入

 更新时间:2022年06月20日 16:29:45   作者:头秃才能变强  
最近在项目开发中遇到的一个excel复杂表头的导入数据库操作,下面这篇文章主要给大家介绍了关于Java 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=语文
到此 多表头的导入就结束了,有的人还是不知道怎么把他存入数据库,那你就要想想了,最笨的方法就是记住下标 填充到实体类中,这个办法非常不推荐 不灵活! 最好办的办法就是用枚举 匹配 文字 再匹配字段 填充实体类 再或者 写个方法 将文字与字段对应上 自动转换实体类。

有的人说 如果我是不固定的表头怎么办呢?

那更简单了,不固定的表头 但是你不可能没有固定的列吧 如果没有固定的列 全部都是不固定的表头 那你就只能做两个表 一个表存字段名称的中文 一个表对应其中的数据,可以自己好好想想。如果是有固定的列 那你就获取固定列的文字 进行判断 然后再获取其中不固定的表头 将其填充。 授人以鱼不如授人以渔 凡事还是多动脑筋,办法已经教了 我也不可能面面俱到

总结

到此这篇关于Java easyExcel的复杂表头多级表头导入的文章就介绍到这了,更多相关Java easyExcel表头导入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中Spark中将对象序列化存储到hdfs

    java 中Spark中将对象序列化存储到hdfs

    这篇文章主要介绍了java 中Spark中将对象序列化存储到hdfs的相关资料,需要的朋友可以参考下
    2017-06-06
  • java实现的正则工具类

    java实现的正则工具类

    这篇文章主要介绍了java实现的正则工具类,可用于针对电话号码、邮箱、QQ号码、QQ密码、手机号的正则验证功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Java垃圾回收器的方法和原理总结

    Java垃圾回收器的方法和原理总结

    本篇文章主要介绍了Java垃圾回收器的方法和原理总结,Java垃圾回收器是Java虚拟机的重要模块,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • Java开发神器Lombok使用详解

    Java开发神器Lombok使用详解

    这篇文章主要介绍了Java开发神器Lombok使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用Java的Lucene搜索工具对检索结果进行分组和分页

    使用Java的Lucene搜索工具对检索结果进行分组和分页

    这篇文章主要介绍了使用Java的搜索工具Lucene对检索结果进行分组和分页的方法,Luence是Java环境中的一个全文检索引擎工具包,需要的朋友可以参考下
    2016-03-03
  • 基于Struts2实现防止表单重复提交

    基于Struts2实现防止表单重复提交

    这篇文章主要介绍了基于Struts2实现防止表单重复提交,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java中String判断值为null或空及地址是否相等的问题

    Java中String判断值为null或空及地址是否相等的问题

    这篇文章主要介绍了Java中String判断值为null或空及地址是否相等的问题,文中举了简单的例子对字符串类型的值和地址问题进行讲解,需要的朋友可以参考下
    2016-01-01
  • Spring Boot提高开发效率必备工具lombok使用

    Spring Boot提高开发效率必备工具lombok使用

    这篇文章主要为大家介绍了Spring Boot提高开发效率的必备工具lombok使用方法示例及步骤说明,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • 10个经典的Java main方法面试题

    10个经典的Java main方法面试题

    这篇文章主要为大家分享了10个经典的Java main方法面试题,与其说是Java面试题,其实也是Java的一些最基础知识问题,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Java中volatile关键字的作用

    Java中volatile关键字的作用

    这篇文章主要介绍了Java中volatile关键字的作用,文章基于Java的相关资料展开对volatile关键字作用的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04

最新评论