码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)


    文章目录

      • 前言
      • 参考目录
      • 框架集成
        • 1、Maven
        • 2、框架集成公共部分
        • 2.1、Excel 操作工具类 `ExcelUtil`
        • 2.2、导入监听接口 `ExcelListener`
        • 2.3、默认监听器 `DefaultExcelListener`
        • 2.3.1、数据处理方法 `DefaultExcelListener#invoke`
        • 2.3.2、异常处理方法 `DefaultExcelListener#onException`
        • 2.4、Excel 结果接口 `ExcelResult`
        • 2.5、默认 Excel 结果对象 `DefautExcelResult`
        • 2.5.1、导入结果 `DefautExcelResult#getAnalysis`
        • 3、导入测试方法
        • 3.1、导入测试接口 `TestDemoController#importData`
        • 3.2、导入对象 `TestDemoImportVo`
        • 4、接口测试
        • 4.1、导入成功
        • 4.2、导入存在异常
      • 执行流程分析
        • 1、流程简图(非常重要)
        • 2、(#1)`TestDemoController#importData`
        • 3、(#2)`ExcelUtil#importExcel`
        • 4、(#4)阅读器生成器 `EasyExcelFactory#read`
        • 5、(#5)工作表 `ExcelReaderBuilder#sheet`
        • 6、(#6)`ExcelReaderBuilder#build`
        • 7、(#7)`ExcelReader#ExcelReader`
        • 8、(#8)根据类型选择执行器 `ExcelAnalyserImpl#choiceExcelExecutor`
        • 8.1、获取 Excel 文件类型
        • 9、(#9)读操作 `ExcelReaderSheetBuilder#doRead`
        • 10、(#10)读取工作表 `ExcelReader#read`
        • 11、(#11)解析 `ExcelAnalyserImpl#analysis`
        • 12、(07#1)xlsx 解析 `XlsxSaxAnalyser#execute`
        • 13、(07#2)解析 xml 源 `XlsxSaxAnalyser#parseXmlSource`
        • 14、(07#3)解析 xml 源 `AbstractSAXParser#parse`
        • 15、(07#4)解析输入源 `XML11Configuration#parse`
        • 16、(07#5)文档扫描 `XMLDocumentFragmentScannerImpl#scanDocument`
        • 16.1、`XMLDocumentFragmentScannerImpl.Driver#next`
        • 17、(07#6)结束行 `FragmentContentDriver#next`
        • 18、(07#7)`XlsxRowHandler#endElement`
        • 19、(07#8)`RowTagHandler#endElement`
        • 20、(#12)结束行 `DefaultAnalysisEventProcessor#endRow`
        • 21、(#13)数据处理 `DefaultAnalysisEventProcessor#dealData`
        • 21.1、构造表头
        • 21.2、(#14)行数据解析
        • 22、(#14)校验异常 `ValidatorUtils#validate`
        • 23、(#15)捕获异常 `DefaultAnalysisEventProcessor#dealData`
        • 24、(#16)自定义异常处理 `onException`
        • 25、解析完成(循环结束)
        • 26、(#17)完成读取
        • 27、(#18)返回结果
        • 28、完成读取(有异常信息)

    前言

    上一篇博客 写了 Excel 2003(*.xls) 文件的导入,这篇是 Excel 2007(*.xlsx),虽然有一些流程是重复的,但还是会一步步列举出来。

    参考目录

    • Easy Excel 官方文档

    框架集成

    这一部分和上一篇博客是一样的,可以跳过直接看流程。

    1、Maven

    总工程 pom.xml, Easy Excel 版本 V3.1.1,poi 版本 V5.2.2
    在这里插入图片描述
    框架这里自行引入了 poi,可以参考 官网描述 修改:
    在这里插入图片描述

    2、框架集成公共部分

    2.1、Excel 操作工具类 ExcelUtil

    框架封装了工具类 ExcelUtil,可以直接进行调用。
    在这里插入图片描述

    2.2、导入监听接口 ExcelListener

    在这里插入图片描述

    2.3、默认监听器 DefaultExcelListener

    在这里插入图片描述

    2.3.1、数据处理方法 DefaultExcelListener#invoke

    在这里插入图片描述
    此处只校验 ImportGroup 分组。

    2.3.2、异常处理方法 DefaultExcelListener#onException

    在这里插入图片描述

    2.4、Excel 结果接口 ExcelResult

    在这里插入图片描述

    2.5、默认 Excel 结果对象 DefautExcelResult

    在这里插入图片描述

    2.5.1、导入结果 DefautExcelResult#getAnalysis

    在这里插入图片描述

    3、导入测试方法

    3.1、导入测试接口 TestDemoController#importData

    在这里插入图片描述

    3.2、导入对象 TestDemoImportVo

    在这里插入图片描述
    导入数据:
    在这里插入图片描述

    先说明一下调用分析流程:

    1. 调用总共分两次,用到的数据是上图(同样的文件,同样的内容)。
    2. 第一次是正常的调用分析,即不进行数据校验(会把相关字段注解注释),目的是先理顺请求流程。
    3. 第二次是有异常的调用分析,即校验有标注组信息 groups = {ImportGroup.class} 的属性字段,其他默认分组不进行校验。

    4、接口测试

    4.1、导入成功

    在这里插入图片描述

    4.2、导入存在异常

    在这里插入图片描述

    执行流程分析

    1、流程简图(非常重要)

    为了便于理解和对比,所以我把两种类型文件的导入流程画在了一张图里面,很多流程是相同的,不同的地方用不同的颜色进行了区分,但是为了简洁和突出重点,并不是每一层都详细列了出来(中间省略了一些不太重要的深入调用,在下面 Debug 分析里面会把截图放出来)。
    在这里插入图片描述
    温馨提醒,由于流程步骤较多,结合这张图走不容易迷路。

    2、(#1)TestDemoController#importData

    在这里插入图片描述

    3、(#2)ExcelUtil#importExcel

    在这里插入图片描述

    4、(#4)阅读器生成器 EasyExcelFactory#read

    在这里插入图片描述

    5、(#5)工作表 ExcelReaderBuilder#sheet

    在这里插入图片描述

    6、(#6)ExcelReaderBuilder#build

    在这里插入图片描述

    7、(#7)ExcelReader#ExcelReader

    在这里插入图片描述
    ExcelAnalyserImpl#ExcelAnalyserImpl
    在这里插入图片描述

    8、(#8)根据类型选择执行器 ExcelAnalyserImpl#choiceExcelExecutor

    在这里插入图片描述

    8.1、获取 Excel 文件类型

    ExcelTypeEnum#valueOf
    在这里插入图片描述
    在这里插入图片描述
    由上图,Easy Excel 底层是根据魔数(Magic Number)确定文件类型。搜索一下 xlsx 文件的魔数:
    在这里插入图片描述
    在这里插入图片描述
    插一个热知识:Java *.class 文件的魔数是 cafe babe。

    其他类型文件魔数请参考以下网站:

    https://www.garykessler.net/library/file_sigs.html
    
    • 1

    得到文件类型为 xlsx,回到主方法 ExcelAnalyserImpl#choiceExcelExecutor 继续执行。
    在这里插入图片描述
    工作表 ExcelReaderSheetBuilder 构建完成:
    在这里插入图片描述

    9、(#9)读操作 ExcelReaderSheetBuilder#doRead

    在这里插入图片描述

    10、(#10)读取工作表 ExcelReader#read

    在这里插入图片描述

    11、(#11)解析 ExcelAnalyserImpl#analysis

    在这里插入图片描述
    在前面步骤 #9 已经通过文件类型确定了是 xlsx 解析器。

    12、(07#1)xlsx 解析 XlsxSaxAnalyser#execute

    在这里插入图片描述
    当前文件只有工作表 sheet1 有数据。
    在这里插入图片描述

    13、(07#2)解析 xml 源 XlsxSaxAnalyser#parseXmlSource

    在这里插入图片描述
    JAXPSAXParser#parse
    在这里插入图片描述

    14、(07#3)解析 xml 源 AbstractSAXParser#parse

    在这里插入图片描述
    XMLParser#parse
    在这里插入图片描述

    15、(07#4)解析输入源 XML11Configuration#parse

    在这里插入图片描述
    在这里插入图片描述

    16、(07#5)文档扫描 XMLDocumentFragmentScannerImpl#scanDocument

    在这里插入图片描述
    do...while 循环里面也有 next() 方法:
    在这里插入图片描述

    16.1、XMLDocumentFragmentScannerImpl.Driver#next

    next() 方法根据不同的事件有不同的实现类:
    在这里插入图片描述
    XMLDocumentScannerImpl#next
    在这里插入图片描述
    举几个例子(不同事件的 next() 实现方法):
    XMLDeclDriver#next
    在这里插入图片描述
    PrologDriver#next
    在这里插入图片描述
    还有结束行调用的 FragmentContentDriver#next。

    17、(07#6)结束行 FragmentContentDriver#next

    在这里插入图片描述
    XMLDocumentFragmentScannerImpl#scanEndElement
    在这里插入图片描述
    在这里插入图片描述
    AbstractSAXParser#endElement
    在这里插入图片描述

    18、(07#7)XlsxRowHandler#endElement

    在这里插入图片描述
    XlsxRowHandler#endElement
    在这里插入图片描述

    19、(07#8)RowTagHandler#endElement

    在这里插入图片描述

    20、(#12)结束行 DefaultAnalysisEventProcessor#endRow

    在这里插入图片描述

    21、(#13)数据处理 DefaultAnalysisEventProcessor#dealData

    21.1、构造表头

    在这里插入图片描述
    DefaultAnalysisEventProcessor#buildHead
    在这里插入图片描述
    DefaultAnalysisEventProcessor#dealData
    在这里插入图片描述
    ModelBuildEventListener#invokeHead
    在这里插入图片描述

    21.2、(#14)行数据解析

    DefaultAnalysisEventProcessor#dealData
    在这里插入图片描述
    DefaultExcelListener#invoke
    在这里插入图片描述

    22、(#14)校验异常 ValidatorUtils#validate

    在前一个步骤中如果校验不通过,则会抛出异常 ConstraintViolationException
    在这里插入图片描述

    23、(#15)捕获异常 DefaultAnalysisEventProcessor#dealData

    在这里插入图片描述

    24、(#16)自定义异常处理 onException

    在这里插入图片描述

    DefaultAnalysisEventProcessor#onException
    在这里插入图片描述

    DefaultExcelListener#onException
    在这里插入图片描述
    在这里插入图片描述

    25、解析完成(循环结束)

    XlsxSaxAnalyser#execute
    在这里插入图片描述
    DefaultAnalysisEventProcessor#endSheet
    在这里插入图片描述
    DefaultExcelListener#doAfterAllAnalysed
    在这里插入图片描述

    26、(#17)完成读取

    ExcelReaderSheetBuilder#doRead
    在这里插入图片描述
    ExcelReader#finish
    在这里插入图片描述
    ExcelAnalyserImpl#finish
    在这里插入图片描述
    在这里插入图片描述

    27、(#18)返回结果

    在这里插入图片描述

    28、完成读取(有异常信息)

    ExcelUtil#importExcel
    在这里插入图片描述
    控制台只输出了校验通过的结果列表:
    在这里插入图片描述
    返回自定义信息(抛出异常)DefautExcelResult#getAnalysis
    在这里插入图片描述
    控制台错误信息:
    在这里插入图片描述
    至此所有流程解析完毕。

  • 相关阅读:
    搞什么啊? URI 和 URL 到现在还不清楚?
    算法通关村第二关-黄金挑战K个一组反转
    数据结构与算法(三) 深度优先搜索
    十九、一起学习Lua 垃圾回收
    Qt --- Day03
    基于HiKariCP组件,分析连接池原理
    Alibaba微服务组件Nacos注册中心
    ArrayList与List的层级关系及ArrayList解析
    kubernetes|云原生| 如何优雅的重启和更新pod---pod生命周期管理实务
    oracle分组排序去重
  • 原文地址:https://blog.csdn.net/Michelle_Zhong/article/details/126933372
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号