EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法

OK,不废话,直接开干!说实话是有些坑,或者是我不会用吧

模板如下:

复制代码
invokeHeadMap 这个方法其实针对第一行就是表头的完全没问题。

针对第二行的,我DEBUG拿到的是这样

很明显,他拿到了第一行;既然他只能拿到第一行的数据,那么我们就换一个思路,只校验能拿到的表头,就不做那么好。思路就是拿到value不为null的key,作为一个新的map,然后再去比对代码如下:
复制代码
    /**
     * 验证具有表头为第二行的 Excel 模板是否正确。
     *
     * @param clazz 要验证的 Excel 类型。
     * @param headMap 包含 Excel 表头信息的映射。
     *
     */
    private void validateTwoRowHeaderMap(Class<?> clazz, Map<Integer, String> headMap) {
        validateExcelTemplate(clazz, headMap);
    }

    /**
     * 验证 Excel 表头信息是否与预定义的属性映射匹配。
     *
     * @param clazz 要验证的 Excel 类型。
     * @param headMap 包含 Excel 表头信息的映射。
     * @return 如果所有表头都匹配,返回 true;否则返回 false。
     */
    private void validateExcelTemplate(Class<?> clazz, Map<Integer, String> headMap) {
        Map<Integer, String> collect = headMap.entrySet().stream()
                .filter(entry -> entry.getValue() != null)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        Map<Integer, String> excelPropertyMap = getExcelPropertyMap(clazz, 0);

        for (Integer i : collect.keySet()) {
            if (!collect.get(i).equals(excelPropertyMap.get(i))) {
                throw new ExcelAnalysisException("模板错误,请检查导入模板");
            }
        }
    }

    /**
     * 根据类类型和位置参数获取 Excel 属性映射。
     *
     * @param clazz 要获取属性映射的 Excel 类型。
     * @param position 位置参数,用于确定具体的属性值。
     * @return 包含 Excel 属性映射的 Map。
     */
    private Map<Integer, String> getExcelPropertyMap(Class<?> clazz,Integer position) {
        Map<Integer, String> excelPropertyMap = new HashMap<>();
        Field[] fields = clazz.getDeclaredFields(); // 获取所有字段,包括私有字段

        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) { // 忽略静态字段
                ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
                if (excelProperty != null) {
                    int index = excelProperty.index();
                    String value = excelProperty.value()[position];
                    excelPropertyMap.put(index, value);
                }
            }
        }
        return excelPropertyMap;
    }

其实我这里是把校验表头为第一行和第二行的分开了,如下图:

然后无语的来了,针对表头为第二行的,走我自己处理以后的方法,框架还会去调用invokeHeadMap方法,并且这次拿到了全部信息,如下图:

然后又走我那个针对表头为第二行的处理方法,成功报错! 就很无语。

搞半天我那个还白写了。

然后我又发现,不是每次都会去调用两次,如果第一次调用的时候,抛了异常,那么就不会调用第二次。

然后我现在也还在看怎么处理一下,反正这个方法,针对复杂表头,需要自己加逻辑处理,直接用是用不了的,我也是记录一下和分享一下思路吧。不过知道了这个流程,处理也不是很麻烦。对了 ,我这个项目时老项目,easyExcel版本是2.几的,我不知道是不是版本的问题,设置了表头行然后神奇的来了,针对表头为第二行的,走我自己处理以后的方法,框架还会去调用数在走这个invokeHeadMap方法的时候没用。貌似3版本可以直接拿到。
欢迎评论区交流!
========================后续来了

简单处理一下吧,能有个作用就行,为每个线程单独设置一个计数器,主要是不想在改了,还在催,能跑就行,代码不要写的太完美了,你弄久了,还嫌你效率低呢,哈哈

参考思路就行了,贴了代码也用不了

相关推荐
Devin~Y20 小时前
大厂 Java 面试实战:从电商微服务到 AI 智能客服(含 Spring 全家桶、Redis、Kafka、RAG/Agent 解析)
java·spring boot·redis·elasticsearch·spring cloud·docker·kafka
无籽西瓜a21 小时前
【西瓜带你学设计模式 | 第十五期 - 策略模式】策略模式 —— 算法封装与动态替换实现、优缺点与适用场景
java·后端·设计模式·软件工程·策略模式
孙同学202021 小时前
如何将 JSON 数据转换为 Excel 工作表
python·json·excel
珍朱(珠)奶茶21 小时前
Spring Boot3整合FreeMark、itextpdf 5/7 实现pdf文件导出及注意问题
java·spring boot·后端·pdf·itextpdf
大数据新鸟21 小时前
微服务之Spring Cloud LoadBalancer
java·spring cloud·微服务
杜子不疼.21 小时前
AI Agent 智能体开发入门:AutoGen 多智能体协作实战教程
java·人工智能·spring
樽酒ﻬق21 小时前
构筑容器化基石:Docker 稳定版本抉择、极速安装与配置全解
java·docker·运维开发
weisian15121 小时前
Java并发编程--29-分布式ID的6种方案:从单机到分库分表的“身份证”设计
java·分布式·雪花算法·美团leaf·百度uid
美式请加冰21 小时前
最短路径问题
java·数据结构·算法
小江的记录本21 小时前
【JEECG Boot】 JEECG Boot 数据字典管理——六大核心功能(内含:《JEECG Boot 数据字典开发速查清单》)
java·前端·数据库·spring boot·后端·spring·mybatis