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

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

 

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


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

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

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

相关文章

python常用框架及使用方法

Python 有着广泛的应用领域&#xff0c;从 Web 开发到数据科学、自动化脚本、机器学习等&#xff0c;每个领域都有对应的强大框架。下面&#xff0c;我将为你介绍一些最常用的 Python 框架及其使用方法&#xff0c;让你快速了解它们的核心功能。 1. Web 开发框架 Django Dja…

高级java每日一道面试题-2024年9月12日-安全篇[加密篇]-有哪些加密算法, 加密算法都有哪些分类?

如果有遗漏,评论区告诉我进行补充 面试官: 有哪些加密算法, 加密算法都有哪些分类? 我回答: 加密算法是用来保护信息安全的技术(保护数据的机密性、完整性和真实性)&#xff0c;它将明文转换为密文&#xff0c;只有拥有正确密钥的接收者才能将其还原为原始的明文。加密算法…

PLC-Recorder 对西门子传动的采集方法

目录 一、增加西门子传动的通道 二、变量配置 2.1 语法格式 a&#xff1a;装置号 b&#xff1a;参数号 c&#xff1a;参数下标 2.2 配置及连接测试情况 三、正式采集 四、小结 PLC-Recorder V3.4.0版本增加了西门子传动参数采集的功能&#xff08;增加了传动的设备类型&a…

详细介绍 Servlet 基本概念——以餐厅服务员为喻

什么是Servlet Servlet 是 Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;中用于构建动态 web 应用的组件。它在服务器端运行&#xff0c;并能够处理客户端请求&#xff0c;生成动态响应。以下是对 Servlet 的详细介绍&#xff1a; 1. Servlet 的基本概念…

(SERIES10)DM逻辑备份还原

1 概念 逻辑备份还原是对数据库逻辑组件&#xff08;如表、视图和存储过程等数据库对象&#xff09;的备份还原。逻辑导出&#xff08;dexp&#xff09;和逻辑导入&#xff08;dimp&#xff09;是 DM 数据库的两个命令行工具&#xff0c;分别用来实现对 DM 数据库的逻辑备份和逻…

Sqlserver常用sql

1. 数据库和表操作 创建数据库 CREATE DATABASE DatabaseName; 删除数据库 DROP DATABASE DatabaseName; 创建表 CREATE TABLE TableName ( Column1 DataType1, Column2 DataType2, ... ); 删除表 DROP TABLE TableName; 2. 数据操作 插入数据 INSERT INTO TableNam…

获取某宝拍立淘API接口:深度学习图像实现匹配和检索

1. 总体概述 拍立淘的核心技术在于图像识别与检索&#xff0c;融合了深度学习、计算机视觉、大数据处理等多个领域的先进技术1。通过构建大规模的商品图像数据库&#xff0c;并利用深度学习算法提取图像特征&#xff0c;实现高效的图像匹配与检索1。 2. 具体技术环节 &#…

【Linux 20】进程控制

文章目录 &#x1f308; 一、创建线程⭐ 1. 线程创建函数⭐ 3. 给线程传参⭐ 4. 创建多线程⭐ 5. 获取线程 ID &#x1f308; 二、终止线程⭐1. 使用 return 终止线程⭐ 2. 使用 pthread_exit 函数终止线程⭐ 3. 使用 pthread_cancel 函数终止线程 &#x1f308; 三、等待线程⭐…

k8s用StatefulSet部署redis

redis-config.yaml &#xff08;配置文件&#xff09; apiVersion: v1 kind: ConfigMap metadata:name: redis-config data:redis.conf: |# Redis general configuration​ bind 0.0.0.0 ​ protected-mode no ​ port 6379 ​ dir /data ​ appendonly yesse…

召回02 Swing 召回通道

为了避免小圈子重合却误判物品相似度很高&#xff1a;降低小圈子对相似度的影响。

更新20240915机器视觉海康Visionmaster学习步骤

一&#xff1a;海康VM软件&#xff1a; https://www.hikrobotics.com/cn/machinevision/service/download?module0 安装三个包(官网已经公布4.4,市面上还是主要以4.3为主) VisionMaster基础安装包V4.3.0 VisionMaster深度学习安装包 V4.3.0 VisionMaster示例程序 V4.3.0 …

matlab data = textscan(lin(5:end),‘%f%f%f%f%*[^\n]‘);语句解释

这行 MATLAB 代码使用 textscan 函数从文本中读取数据&#xff0c;并将其存储在 data 变量中。 data textscan(lin(5:end), %f%f%f%f%*[^\n]);解释 1. textscan 函数 textscan 是 MATLAB 中用于从文本中读取数据的函数。它将文本行按指定的格式读取&#xff0c;并将结果存储…

cc2530按键中断实现控制LED

1开启中断的步骤 1-1使能端口组的中断 IEN1 IEN2 实例 IEN2 | 0x10 //使能P1口中断 1-2 端口中断屏蔽 P0IEN和P1IEN P2IEN 实例 P1IEN |0x10&#xff1b; //使能P1_2口中断 1-3设置触发方式 PICTL 实例 PICTL |0X02 ;//P1_3到P1_2口下降沿触发 1-4设置中断优先级…

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

数据结构应用实例(五)——关键路径

Content: 一、问题描述二、算法思想三、代码实现四、小结 一、问题描述 设计实现 AOE 网的关键活动与关键路径问题&#xff1b; 二、算法思想 获取拓扑序列&#xff1b;计算节点的最早开始时间 v e [ i ] ve[i] ve[i]&#xff1b;计算节点的最晚开始时间 v l [ j ] vl[j] v…

《SpringBoot+Vue》Chapter01_SpringBoot介绍

SpringBoot的介绍 简单来说&#xff0c;SpringBoot就是Spring提供的用于Web开发的脚手架框架。配置简单、上手快速 SpringBoot的特性 自带tomcat、Jetty服务器可以部署war包自动配置Spring框架和第三方框架能够提供应用的健康监控和配置的监控没有代码生成&#xff0c;并且尽可…

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/128600583 https://blog.csdn.net/weixin_…

富文本中去掉 HTML 和 CSS 样式,只保留纯文本

要从富文本中去掉 HTML 和 CSS 样式&#xff0c;只保留纯文本&#xff0c;可以使用以下几种方法&#xff1a; 1. 纯 JavaScript 方法 你可以使用 JavaScript 的 innerText 或 textContent 来提取文本&#xff0c;而忽略 HTML 标签和样式。 function stripHtml(html) {var te…

C++_20_多态

多继承会造成 菱形继承** 使用虚继承来解决 不是给爷爷类加 也不是给子类加 是给父类加 虚基指针和虚基表 多态 概念&#xff1a; 概念&#xff1a; 一个事物的多种形态&#xff0c;简称多态 如&#xff1a; 对象的多态 ​ 张三 ​ 在对象面前 怂 ​ 在朋友面前 谄媚 ​ 在父…

python 读取excel数据存储到mysql

一、安装依赖 pip install mysql-connector-python 二、mysql添加表students CREATE TABLE students (ID int(11) NOT NULL AUTO_INCREMENT,Name varchar(50) DEFAULT NULL,Sex varchar(50) DEFAULT NULL,PRIMARY KEY (ID) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETu…