解析Excel数据如虎添翼:Excel数据监听器助你快速解析数据,轻松驾驭业务需求,一键解析,风云再起,数据处理从未如此简单,事半功倍

以下代码是一个Excel数据监听器,用于监听和处理Excel数据的读取事件。它实现了AnalysisEventListener接口,并重写了其中的方法。以下是代码中的主要部分:

  • invokeHead方法:在解析Excel表格的表头时触发的回调方法。通过比较模板表头和当前上传文件的表头,检查表头的合法性。
  • invoke方法:在解析Excel表格的数据行时触发的回调方法。在这个方法中可以处理每一行的数据逻辑。
  • onException方法:当解析过程中发生异常时触发的回调方法。如果是Excel数据转换异常,则会记录日志并抛出自定义的BizException异常。其他异常会直接抛出。
  • doAfterAllAnalysed方法:当整个Excel表格解析完成时触发的回调方法。在这个方法中可以进行数据处理、数据存储、数据校验等业务逻辑的处理。
  • getDataList方法:用于获取解析过程中的数据行信息。
  • readTemplateHeader方法:用于读取Excel模板的表头。

这段代码的作用是根据传入的Excel模板路径和文件名,解析Excel文件,并进行表头校验和数据行处理,文章中只处理了按照模板校验表头是否合法,针对动态传入List形式的表头可自行扩展


/*** Excel数据监听器,用户监听和处理Excel数据的读取事件* 实现了EasyExcel库的AnalysisEventListener接口,实现了相应的回掉方法** @author 管理员* @date 2024/2/27* @param <T> 要解析的Excel数据对象的类型*/
@Slf4j
public class ExcelListener < T > extends AnalysisEventListener < T > {/*** 文件特殊字符规则*/private static final String FILE_SPECIAL_REGEX = "[\\/:*?\"<>|;.]";/*** 用于存储解析过程中数据行信息*/private final List < T > dataList = Lists.newArrayList();/*** Excel模板路径(此实现是resource路径)*/private String templatePath;/*** 模板表头集合*/private List < String > templateHeaderList;/*** Excel数据监听器构造方法** @author 管理员* @date 2024/3/4*/public ExcelListener() {}/*** Excel数据监听器构造方法,此构造方法会校验表头是否合法【注意】:此方法默认为第一行为表头,如不是请重写构造方法传入表头对应行数** @author 管理员* @date 2024/3/4* @param templatePath 模板路径(resource路径)*/public ExcelListener(String templatePath) {this.templatePath = templatePath;this.templateHeaderList = readTemplateHeader();}/*** Excel数据监听器构造方法,此构造方法会校验表头是否合法,文件名称非法* 【注意】:此方法默认为第一行为表头,如不是请重写构造方法传入表头对应行数** @author 管理员* @date 2024/3/4* @param templatePath 模板路径(resource路径)* @param excelFileName 上传Excel文件名称* @throws BizException 业务异常*/public ExcelListener(String templatePath, String excelFileName) {// 文件名不能包含特殊字符if (ReUtil.contains(FILE_SPECIAL_REGEX, FileNameUtil.mainName(excelFileName))) {throw new BizException("业务错误码","误码提示");}// 判断文件后缀是否是Excel 文件格式错误if (!ReUtil.isMatch("(xlsx|xls)$", FileNameUtil.extName(excelFileName).toLowerCase())) {throw new new BizException("业务错误码","误码提示");}this.templatePath = templatePath;this.templateHeaderList = readTemplateHeader();}@Overridepublic void invokeHead(Map < Integer, CellData > headMap, AnalysisContext context) {// 当解析Excel表格的表头时触发的回调方法,此处可在类中添加成员变量,校验表头合法性// invokeHead抛出异常只会终止当前invokeHead方法的执行,可在OnException中处理并终止程序// headMap存储所有表头信息,可与成员变量对比,不一致则不合法// 未传入模板路劲则表示无须对比模板表头,直接调用默认父类方法if (CharSequenceUtil.isBlank(templatePath)) {super.invokeHead(headMap, context);return;}// 模板表头无内容表示模板错误if (CollUtil.isEmpty(templateHeaderList)) {throw new BizException("业务错误码","误码提示");}List < String > currentHeaderList = Lists.newArrayListWithCapacity(headMap.size());headMap.forEach((columnIndex, cellData) -> currentHeaderList.add(cellData.getStringValue()));// 比较模板的表头与当前上传文件的表头,如果两个表头不一致则表示模板错误,抛出异常if (!CollUtil.isEqualList(templateHeaderList, currentHeaderList)) {throw new BizException("业务错误码","误码提示");}// 无任何异常执行直接调用默认父类方法super.invokeHead(headMap, context);}@Overridepublic void invoke(T rowData, AnalysisContext analysisContext) {// 当解析Excel表格的数据行时触发的回调方法,在这个方法中可以处理每一行的数据逻辑dataList.add(rowData);}@Overridepublic void onException(Exception exception, AnalysisContext context) {// onException抛出异常会终止解析,并在最外层可捕获该异常// 解析过程中发生异常的逻辑,一般记录日志if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;StringBuilder stringBuffer = new StringBuilder();stringBuffer.append("第").append(excelDataConvertException.getRowIndex()).append("行,").append(excelDataConvertException.getColumnIndex()).append("列解析异常").append("异常数据为:").append(excelDataConvertException.getCellData()).append("异常列属性为:").append(excelDataConvertException.getExcelContentProperty().getHead());log.error(stringBuffer.toString());throw new BizException("业务错误码",stringBuffer.toString());}else if (exception instanceof BizException) {throw (BizException) exception;}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 当整个Excel表格解析完成时触发的回调方法,解析完毕之后一般有以下逻辑处理// 数据处理、数据存储、数据校验、业务通知// 逻辑1:当dataList为空,标识文件中没有数据行,可以认为是一个人空模板if (CollUtil.isEmpty(dataList)) {throw new BizException("业务错误码","误码提示");}}/*** 获取解析过程中的数据行信息** @author 管理员* @date 2024/2/27* @return 数据行信息*/public List < T > getDataList() {return dataList;}/*** 读取Excel模板表头** @author 管理员* @date 2024/3/4* @return Excel模板表头* @throws BizException 业务异常*/private List < String > readTemplateHeader() {// 无模板路径不解析模板表头if (CharSequenceUtil.isBlank(templatePath)) {return Lists.newArrayList();}try (InputStream inputStream = ResourceUtil.getStreamSafe(templatePath)) {List < Map < Integer, String > > headList = EasyExcelFactory.read(inputStream).headRowNumber(0).sheet().doReadSync();// 读取表头不为空,只要模板没问题,肯定不会空if (CollUtil.isNotEmpty(headList)) {Map < Integer, String > headMap = headList.get(0);List < String > headerList = Lists.newArrayListWithExpectedSize(headMap.size());headMap.forEach((key, value) -> headerList.add(value));return headerList;}}catch (IOException ex) {log.error("读取Excel模板表头异常", ex);throw new BizException("业务错误码","误码提示");}return Lists.newArrayList();}
}

方式一:表头文件什么的都不做任何校验

ExcelListener < T > excelListener = new ExcelListener <>();

方式二:此种方式只校验表头

ExcelListener < T > excelListener = new ExcelListener <>(templatePath);

方式三:最后这种方式校验表头与文件的合法性

ExcelListener < T > excelListener = new ExcelListener <>(templatePath,fileName);

excelListener 传入EasyExcelFactory中实现文件解析并转换为对应实体对象

EasyExcelFactory.read(inputStream, clazz, excelListener).sheet().doRead();

总而言之,该Excel数据监听器可以帮助用户高效、准确地解析和处理Excel数据。它提供了表头校验、数据处理和异常处理等功能,使得数据的导入和处理变得更加简单和可靠。无论是处理大规模数据还是进行数据校验,该监听器都能够帮助用户提升工作效率,减少错误率。

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

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

相关文章

企业数字人虚拟形象定制解决方案

随着数字化浪潮的推进&#xff0c;虚拟形象在各个领域都展现出了强大的潜力&#xff0c;美摄科技作为业界领先的数字人虚拟形象定制解决方案提供商&#xff0c;致力于为企业打造独一无二的虚拟形象&#xff0c;助力企业在数字世界中塑造独特的品牌形象。 一、解决方案概览 美…

理德外汇名人故事:个人投资者大使——威廉·欧奈尔

威廉•欧奈尔&#xff08;William J.O’Neil&#xff09;是美国著名的成长性企业的投资大师&#xff0c;投资生涯接近50年。1988年&#xff0c;出版《How to Make Money in Stocks: A winning system in good times or bad》一书&#xff0c;国内译为《笑傲股市》&#xff0c;成…

02-prometheus监控-服务器节点监控node-exporter

一、概述 prometheus&#xff0c;本身是一个【数据收集】和【数据处理】的工具&#xff0c;如果效果要监控一台服务器物理机&#xff0c;有两种方式&#xff0c;一种是在物理机上部署“node-export”来收集数据上报给prometheus&#xff0c;另一种是“自定义监控”&#xff1b;…

SqlServer 默认值约束示例

创建表&#xff0c;创建时指定 money 字段默认值为0.00&#xff1b; create table t_24 ( account varchar(19) not null, id_card char(18) not null, name varchar(20) not null, money decimal(16,2) default 0.00 not null ); 录入2条记录&#xff0c;money字…

YoloV8改进策略:卷积改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…

HTML极速入门

HTML基础 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言. 超文本:比文本更强大.通过链接和交互式方式来组织和呈现信息的文本形式.不仅仅有文本,还可能包括图片,音频,或者自己经审阅过它的学者所加的评注,补充或脚注等. 标记语言:由标签构成的语言 HTML的标…

es6 相关面试题

1 var, let ,const 区别&#xff1f; 2 手写将对象进行合并 手写合并对象 3 普通函数和箭头函数区别&#xff1f; 4 find 和 filter的区别&#xff1f; 5 some和every区别&#xff1f;

ES核心概念(45-48)(56-62)(101-103)

ES集群 ES集群&#xff08;Cluster&#xff09;包含多个节点&#xff08;服务器&#xff09;&#xff0c;整体提供服务 核心概念 索引Index&#xff1a;类似于mysql中的表 映射Mapping:数据的结构信息 文档&#xff1a;相当于表中的一条记录 分片&#xff1a; 将数据分成多片…

Transformer、BERT和GPT 自然语言处理领域的重要模型

Transformer、BERT和GPT都是自然语言处理领域的重要模型&#xff0c;它们之间有一些区别和联系。 区别&#xff1a; 架构&#xff1a;Transformer是一种基于自注意力机制的神经网络架构&#xff0c;用于编码输入序列和解码输出序列。BERT&#xff08;Bidirectional Encoder R…

java 面试题总结

1锁粗化和锁消除&#xff0c;锁膨胀和锁升级的区别。 https://www.cnblogs.com/xuxinstyle/p/13387778.html .无锁 < 偏向锁 < 轻量级锁 < 重量级锁 &#xff0c;说的时候不要忘记说无锁状态 2.Map 的实现&#xff0c;线程安全的实现 1、ConcurrentHashMap在JDK 1.7…

第五套CCF信息学奥赛c++练习题 CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(阅读程序题)

第五套中小学信息学奥赛CSP-J考前冲刺题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff0c;判断题正确填√错误填X;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40分) 第一题 递归函数 1 #include<iostream> 2 usin…

git常用命令集合

1.差异对比 显示出branch1和branch2中差异的部分 git diff branch1 branch2 --stat显示出所有有差异的文件的详细差异 git diff branch1 branch2查看branch1分支有&#xff0c;而branch2中没有的log git log branch1 ^branch22.分支 列出所有本地分支 git branch列出所有远…

学生管理系统(python实现)

新增学生显示学生查找学生删除学生存档到文件 约定好数据的存储格式&#xff1a; 约定把数据保存在和py文件同级目录中&#xff0c;文件名为record.txt 文件内容按照行文本的方式来表示 首先这是一个文本文件&#xff0c;里面包含了很多行&#xff0c;每一行代表一个学生 …

主要用于工控主板、工业控制器、程序烧录下载器、仿真器、新能源充电桩等众多涉及RS232通讯的产品——D3232

一、应用领域 D3232芯片主要用于工控主板、工业控制器、程序烧录下载器、仿真器、新能源充电桩等众多涉及RS232通讯的产品。 二、基本特性 D3232芯片由两个线路驱动器、两个线路接收器和双电荷泵电路组成&#xff0c;具有HBM>15kV、CDM>2kV的ESD保护能力&#xff0c;并且…

NLP_文本张量表示方法_2(代码示例)

目标 了解什么是文本张量表示及其作用.文本张量表示的几种方法及其实现. 1 文本张量表示 将一段文本使用张量进行表示&#xff0c;其中一般将词汇为表示成向量&#xff0c;称作词向量&#xff0c;再由各个词向量按顺序组成矩阵形成文本表示. ["人生", "该&q…

【力扣 - 盛最多水的容器】

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

LeetCode 0232.用栈实现队列:基础数据结构的学习

【LetMeFly】232.用栈实现队列&#xff1a;基础数据结构的学习 力扣题目链接&#xff1a;https://leetcode.cn/problems/implement-queue-using-stacks/ 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff0…

【源码】imx6ull实现触摸屏单点实验-移植tslib和qt

一、本实验实验的器材&#xff1a; 1.正点原子imx6ull的阿尔法开发板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、实验已经移植好的文件&#xff1a; 仓库代码&#xff1a;https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件说明 arm-qt.tar.bz2&#xff1a;移植好的…

笔记本电脑里回收站删除的文件怎么找回来?这几招帮你恢复

在日常使用笔记本电脑的过程中&#xff0c;我们可能会因为不小心或者误操作&#xff0c;将一些重要的文件删除到回收站&#xff0c;甚至可能直接从回收站中清空。面对这种情况&#xff0c;很多人会感到惊慌失措&#xff0c;不知道如何是好。但其实&#xff0c;即使文件从回收站…

通过SDKMAN安装各种版本JDK

文章目录 1. 安装SDKMAN管理器2. 通过SDK管理器安装JDK3. 参考链接 1. 安装SDKMAN管理器 安装SDKMAN的脚本为: # 1.1 安装: 如果没有权限可以考虑sudo用户执行; curl -s "https://get.sdkman.io" | bash# 1.2 安装完成后查看版本号 sdk version# 1.3 查看帮助信息 …