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

news2024/11/18 15:49:02

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版本可以直接拿到。
欢迎评论区交流!

========================后续来了

 

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过OceanBase的多级弹性扩缩容能力应对业务洪峰

每周四晚上的10点&#xff0c;都有近百万的年轻用户进入泡泡玛特的抽盒机小程序&#xff0c;共同参与到抢抽盲盒新品的活动中。瞬间的并发流量激增对抽盒机小程序的系统构成了巨大的挑战&#xff0c;同时也对其数据库的扩容能力也提出了更高的要求。 但泡泡玛特的工程师们一点…

安卓BLE蓝牙通讯

蓝牙测试demo 简介   Android手机间通过蓝牙方式进行通信&#xff0c;有两种常见的方式&#xff0c;一种是socket方式&#xff08;传统蓝牙&#xff09;&#xff0c;另一种是通过GATT&#xff08;BLE蓝牙&#xff09;。与传统蓝牙相比&#xff0c;BLE 旨在大幅降低功耗。这样…

Superset二次开发之源码DependencyList.tsx 分析

功能点 路径 superset-frontend\src\dashboard\components\nativeFilters\FiltersConfigModal\FiltersConfigForm\DependencyList.tsx /*** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* dist…

OpenCV结构分析与形状描述符(24)检测两个旋转矩形之间是否相交的一个函数rotatedRectangleIntersection()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 测两个旋转矩形之间是否存在交集。 如果存在交集&#xff0c;则还返回交集区域的顶点。 下面是一些交集配置的例子。斜线图案表示交集区域&#…

C++《类和对象》(下)

在之前类和对象&#xff08;中&#xff09;我们学习了类当中的6大默认成员函数&#xff0c;我们了解了6大成员函数的结构特征和特点以及在不同情况各个成员函数是如何调用的&#xff0c;那么接下来我们在本篇当中将继续学习之前在学习构造函数中未了解的初始化列表&#xff0c;…

MySql基础-单表操作

1. MYSQL概述 1.1 数据模型 关系型数据库 关系型数据库(RDBMS)&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护 使用SQL语言操作&#xff0c;标准统一&…

高性能微服务架构:Spring Boot 集成 gRPC 实现用户与订单服务即时交互

gRPC 是一种由 Google 开发的高性能、开源的远程过程调用&#xff08;Remote Procedure Call, RPC&#xff09;框架。它允许在不同的计算机系统或进程之间进行通信&#xff0c;使得分布式系统和微服务架构中的服务之间能够轻松地相互调用方法。gRPC 基于 HTTP/2 协议&#xff0…

django-admin自定义功能按钮样式

位置在原来的django-admin 栏中的上方【会因为屏幕大小而变换位置】 <!-- 这里是不会替换掉旧的 添加按钮 &#xff0c;而是添加多一个按钮【点击Crawl Data】--> <!-- /home/luichun/lc/Pyfile/Pywebback/app/paqu/templates/admin/yourmodel_changelist.html -->…

基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

安全基础设施如何形成统一生态标准?OASA 硬件安全合作计划启动 | 2024 龙蜥大会

近日&#xff0c;2024 龙蜥操作系统大会&#xff08;OpenAnolis Conference&#xff09;在北京盛大召开。 与此同时&#xff0c;由龙蜥社区运营委员会副主席、龙腾计划生态负责人金美琴&#xff0c;阿里云智能集团高级技术专家张天佳&#xff0c;海光信息技术生态技术总监李伟&…

系统架构设计师教程 第5章 5.2需求工程 笔记

5.2 需求工程 ★★★★★ 软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望。 软件需求包括3个不同的层次&#xff1a;业务需求、用户需求和功能需求(也包括非功能需求)。 (1)业务需求 (business requirement) 反映了组织机构或客户对系统、产品高层次的目标…

用SpringBoot进行阿里云大模型接口调用同步方法和异步方法

同步效果就不展示了,这里展示更常用的异步,多轮异步流式效果展示如下: 结果内容组合 1、同步版本环境准备以及代码 需要开通阿里大模型服务,如果没有开通服务,单独的去生成 key 是无效的。 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 生成你需要的 key 1、…

PHP智慧家政同城服务家政系统小程序源码

智慧家政&#xff0c;同城服务新篇章 —— 探索家政系统的无限可能 开篇&#xff1a;走进智慧家政时代 在这个快节奏的生活中&#xff0c;每一分每一秒都显得尤为珍贵。当忙碌成为常态&#xff0c;如何让家成为真正的避风港&#xff1f;答案或许就藏在“智慧家政同城服务家政…

【JavaScript】数据结构之链表

什么是链表&#xff1f; 多个元素存储的列表链表中的元素在内存中不是顺序存储的&#xff0c;而是通过“next”指针联系在一起的&#xff0c;这个“next”可以自定义。JS中的原型链原理就是链表结构&#xff0c;是通过__proto__指针联系在一起的。 链表和数组的区别 数组是…

c++207 运算重载

调入 op #include<iostream> using namespace std;class Complex { public:int a;int b; public:Complex(int a 0, int b 0){this->a a;this->b b;}void printfCom(){cout << a << "" << b << "i" << endl…

Django视图:构建动态Web页面的核心技术

Django&#xff0c;作为一个强大的Python Web框架&#xff0c;提供了一套完整的工具来构建这些动态页面。在Django的架构中&#xff0c;视图&#xff08;Views&#xff09;是处理用户请求并生成响应的关键组件。本文将深入探讨Django视图的工作原理&#xff0c;以及如何使用它们…

科技与艺术完美融合的LED异形创意圆形(饼/盘)显示屏横空出世

随着LED技术的飞速发展&#xff0c;这款集科技与艺术于一体的异形创意圆形&#xff08;饼/盘&#xff09;显示屏&#xff0c;不仅以其独特的形态打破了传统显示屏的界限&#xff0c;更在视觉呈现上开启了前所未有的新篇章。它不再仅仅是信息传递的载体&#xff0c;而是成为了空…

外观模式详解:如何为复杂系统构建简洁的接口

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 外观模式 外观模式&#xff08;Facade Pattern&#xff09;为子系统中的一组…

AI重塑视觉体验:将图像与视频转化为逼真可编辑的3D虚拟场景

在这个数字化飞速发展的时代&#xff0c;AI技术正以前所未有的方式重塑我们的视觉体验。特别是当AI能够轻松将普通的照片和视频转化为高度逼真、可交互的3D虚拟场景时&#xff0c;它不仅简化了3D内容创作的复杂性&#xff0c;还极大地拓宽了应用场景的边界。今天&#xff0c;我…

医学数据分析实训 项目二 数据预处理作业

文章目录 项目二 数据预处理一、实践目的二、实践平台三、实践内容任务一&#xff1a;合并数据集任务二&#xff1a;独热编码任务三&#xff1a;数据预处理任务四&#xff1a;针对“项目一 医学数据采集”中“3. 通过 UCI 机器学习库下载数据集”任务所下载的数据集进行预处理。…