当前位置: 首页 > news >正文

EasyExcel判断导入时是否符合给定模板

问题描述
在做系统的导入导出模块时需要在导入时判断用户导入的表格是否符合给定的模板,该系统导入导出使用的是EasyExcel,因此在实现该功能时是基于EasyExcel的

解决方案
创建Spring Boot项目,并添加如下依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version>
</dependency>

创建导入时数据对应的实体类,并使用@ExcelProperty注解配置模板表头

public class EasyExcelData {@ExcelProperty(value = "学号", index = 0)private String no;@ExcelProperty(value = "姓名", index = 1)private String name;@ExcelProperty(value = "性别", index = 2)private String gender;private String errorReason;public String getNo() {return no;}public void setNo(String no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getErrorReason() {return errorReason;}public void setErrorReason(String errorReason) {this.errorReason = errorReason;}@Overridepublic String toString() {return "EasyExcelData{" +"no='" + no + '\'' +", name='" + name + '\'' +", gender='" + gender + '\'' +", errorReason='" + errorReason + '\'' +'}';}
}

创建监听类并继承AnalysisEventListener类,重写invokeHeadMap方法,在该方法中判断是否符合模板

public class EasyExcelDemoListener extends AnalysisEventListener<EasyExcelData> {private List<EasyExcelData> correctData = new ArrayList<>();private List<EasyExcelData> errorData = new ArrayList<>();/*** 在这里进行模板的判断* @param headMap 存放着导入表格的表头,键是索引,值是名称* @param context*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {/*count 记录模板表头有几个,用以判断用户导入的表格是否和模板完全一致如果用户导入表格较模板的表头多,但其余符合模板,这样不影响则不需要*/int count = 0;// 获取数据实体的字段列表Field[] fields = EasyExcelData.class.getDeclaredFields();// 遍历字段进行判断for (Field field : fields) {// 获取当前字段上的ExcelProperty注解信息ExcelProperty fieldAnnotation = field.getAnnotation(ExcelProperty.class);// 判断当前字段上是否存在ExcelProperty注解if (fieldAnnotation != null) {++count;// 存在ExcelProperty注解则根据注解的index索引到表头中获取对应的表头名String headName = headMap.get(fieldAnnotation.index());// 判断表头是否为空或是否和当前字段设置的表头名不相同if (StringUtils.isEmpty(headName) || !headName.equals(fieldAnnotation.value()[0])) {// 如果为空或不相同,则抛出异常不再往下执行throw new RuntimeException("模板错误,请检查导入模板");}}}// 判断用户导入表格的标题头是否完全符合模板if (count != headMap.size()) {throw new RuntimeException("模板错误,请检查导入模板");}}/*** 在这里可以进行数据的解析,每读取一条数据都会执行这个方法* @param easyExcelData 当前读取的数据* @param analysisContext*/@Overridepublic void invoke(EasyExcelData easyExcelData, AnalysisContext analysisContext) {if (StringUtils.isEmpty(easyExcelData.getNo())) {easyExcelData.setErrorReason("学号为空");errorData.add(easyExcelData);} else if (StringUtils.isEmpty(easyExcelData.getName())) {easyExcelData.setErrorReason("姓名为空");errorData.add(easyExcelData);} else if (StringUtils.isEmpty(easyExcelData.getGender())) {easyExcelData.setErrorReason("性别为空");errorData.add(easyExcelData);} else {correctData.add(easyExcelData);}}/*** 这里是读取完成后执行的方法* @param analysisContext*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 打印没有错误的数据System.out.println(correctData);// 打印有错误的数据System.out.println(errorData);}
}

进行测试,测试用到的表格可到EasyExcel判断导入时是否符合给定模板测试表格获取

@Test
public void testEasyExcelReadError() {// 读取错误表格String fileName = "excel" + File.separator + "demo-error.xlsx";EasyExcel.read(fileName, EasyExcelData.class, new EasyExcelDemoListener()).sheet().doRead();
}@Test
public void testEasyExcelReadCorrect() {// 读取正确表格String fileName = "excel" + File.separator + "demo-correct.xlsx";EasyExcel.read(fileName, EasyExcelData.class, new EasyExcelDemoListener()).sheet().doRead();
}

相关文章:

EasyExcel判断导入时是否符合给定模板

问题描述 在做系统的导入导出模块时需要在导入时判断用户导入的表格是否符合给定的模板&#xff0c;该系统导入导出使用的是EasyExcel&#xff0c;因此在实现该功能时是基于EasyExcel的 解决方案 创建Spring Boot项目&#xff0c;并添加如下依赖 <dependency><group…...

BDD - Python Behave Retry 机制

BDD - Python Behave Retry 机制 引言Behave RetryBehave Retry 应用feature 文件创建 step 文件Retry运行 Behave 并生成 rerun 文件重新运行失败的场景 引言 在日常运行测试用例&#xff0c;有时因为环境不稳定造成一些测试用例跑失败了&#xff0c;如果能将这些失败的测试用…...

链 表

3_1 删除链表中的节点 Answer-将被删节点下一个val复制到待删除节点&#xff0c;然后将待删节点直接连接到下下一个节点即可。 学到&#xff1a; /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) …...

一个可以用于生产环境得PHP上传函数

上传表单 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文件上传</title> </head> <body><h1>选择要上传的文件</h1><!-- 定义一个包含文件输入字段的表单 --…...

PyTorch中常用的工具(3)TensorBoard

文章目录 前言3 可视化工具3.1 TensorBoard 前言 在训练神经网络的过程中需要用到很多的工具&#xff0c;最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块&#xff0c;合理使用这些工具可以极大地提高编程效率。 由于内容较多&#xff0c…...

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat&#xff0c;所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用&#xff0c;其中关于文档如何进行分块的详细&#xff0c;可以参考笔者的另几篇文章&#xff1a; 大模型RAG 场景、数据、应用难点与解决&#xff08;四&#xff09;R…...

软件体系架构复习二

呃&#xff0c;前面复习的忘了发了。从后面开始吧 Unit 11--18 复习Tips&#xff1a; 重点在于对概念的理解&#xff0c;概念间关系的理解。 对具体的识别方法&#xff0c;处理方法等根据自己的兴趣做一些了解即可 。 如&#xff1a;关于 软件架构脆弱性的成因 &#xff0c; …...

产品经理学习-策略产品指标

目录&#xff1a; 数据指标概述 通用指标介绍 Web端常用指标 移动端常用指标 如何选择一个合适的数据指标 数据指标概述 指标是衡量目标的一个参数&#xff0c;指一项活动中预期达到的指标、目标等&#xff0c;一般用数据表示&#xff0c;因此又称为数据指标&#xff1b;…...

【c语言】日常刷题☞有趣的题目分享❀❀

︿(&#xffe3;︶&#xffe3;)︿hi~~ ヽ(&#xffe3;ω&#xffe3;(&#xffe3;ω&#xffe3;〃)ゝ本次刷题发现3个比较有趣的题目&#xff0c;分享给您&#xff0c;希望对您有所帮助&#xff0c;谢谢❀❀~ 目录 1.单词覆盖还原&#xff08;单词的连续性&#xff09; …...

LINUX 抓包工具Tcpdump离线安装教程

本次教程基于内网环境无法访问网络使用安装包进行安装抓包工具 1、首先给大家看下一共有6个安装包&#xff0c;依次进行解压&#xff0c;包我就放到csdn上了&#xff0c;需要的可以联系我进行下载 2打包然后传到服务器任意一个目录下&#xff0c;进入到当前目录&#xff0c;然后…...

c语言-string.h库函数初识

目录 前言一、库函数strlen()1.1 strlen()介绍1.2 模拟实现strlen() 二、库函数strcpy()2.1 strcpy()介绍2.2 模拟实现strcpy() 三、库函数strcmp()3.1 strcmp()介绍3.3 模拟实现strcmp() 总结 前言 本篇文章介绍c语言<string.h>头文件中的库函数&#xff0c;包含strlen…...

PyTorch官网demo解读——第一个神经网络(4)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;3&#xff09;-CSDN博客 上一篇我们聊了手写数字识别神经网络的损失函数和梯度下降算法&#xff0c;这一篇我们来聊聊激活函数。 大佬说激活函数的作用是让神经网络产生非线性&#xff0c;类似人脑神经元…...

TCP发送和接受数据

发送数据 public class sendmessage {public static void main (String[] args) throws IOException {//创建socket对象//在创建的同时会连接服务器,若连接不上,代码会报错Socket socketnew Socket("127.0.0.1",10086);//从连接通道中获取输出流OutputStream ossock…...

SpringBoot快速集成多数据源(自动版)

有些人因为看见所以相信&#xff0c;有些人因为相信所以看见 有目录&#xff0c;不迷路 前期准备实现演示代码地址参考 最近研究了一下多数据源&#xff0c;这篇博客讲的是简单模式&#xff0c;下篇博客预计写自动切换模式 前期准备 本篇博客基于SpringBoot整合MyBatis-plus&a…...

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…...

阶段五-JavaWeb综合练习-学生管理系统

一.项目说明 1.前台 (用户使用) 前端,后端 2.后台 (管理员使用) 前端,后端 3.该项目为后台管理系统 项目开发流程: 1.需求分析 1.1 登录功能 用户访问登录页面输入用户名和密码,并且输入验证码。全部输入正确后点击登录&#xff0c;登录成功跳转主页面&#xff1b;登录…...

DevC++ easyx实现视口编辑--像素绘图板与贴图系统

到了最终成果阶段了&#xff0c;虽然中间有一些代码讲起来没有意思&#xff0c;纯靠debug,1-1解决贴图网格不重合问题&#xff0c;这次是一个分支结束。 想着就是把瓦片贴进大地图里。 延续这几篇帖子&#xff0c;开发时间也从2023年的4月16到了6月2号&#xff0c;80小时基本…...

Visual studio 2010的安装与使用

一、下载及安装 1、下载软件。 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/115RibV7dOI_y8LUGW-94cA?pwd4hrs 提取码&#xff1a;4hrs 2、右键解压下载好的文件。 3、找到cn_visual_2010_……/Setup.hta&#xff0c;双击运行。 4、选择第三个“ Visual…...

Download Monitor Email Lock下载监控器邮件锁插件

打开Download Monitor Email Lock下载监控器邮件锁插件 Download Monitor Email Lock下载监控器邮件锁插件下载监视器的电子邮件锁定扩展允许您要求用户在获得下载访问权限之前填写他们的电子邮件地址。 Download Monitor Email Lock下载监控器邮件锁插件用法 安装扩展程序后…...

在vscode中创建任务编译module源文件

接昨天的文章 [创建并使用自己的C模块&#xff08;Windows10MSVC&#xff09;-CSDN博客]&#xff0c;觉得每次编译转到命令行下paste命令过于麻烦&#xff0c;于是研究了一下在vscode中创建自动编译任务。 经过尝试&#xff0c;在task.json中增加如下代码&#xff1a; {"…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...