文章目录

  • 前言
  • 参考目录
  • 框架集成
    • 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

得到文件类型为 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

控制台错误信息:

至此所有流程解析完毕。

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)相关推荐

  1. 【RuoYi-Vue-Plus】学习笔记 41 - Easy Excel(一)Excel 2003(*.xls)导入流程分析(源码)

    文章目录 前言 参考目录 框架集成 1.Maven 2.框架集成公共部分 2.1.Excel 操作工具类 `ExcelUtil` 2.2.导入监听接口 `ExcelListener` 2.3.默认监听 ...

  2. java springboot VUE 在线学习平台系统开发mysql数据库web结构java编程计算机网页源码maven项目前后端分离

    一.源码特点   springboot VUE 在线学习平台系统是一套完善的完整信息管理类型系统 前后端分离,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系 ...

  3. cocos2d-x 学习笔记(4)cocos2d-x 小游戏类似打地鼠(含源码)

    源码下载 http://download.csdn.net/detail/u011261250/5719559 这是我自学一星期写的,cocos2d-x版本是2.1.4,是一个简单的类似打地鼠的游戏, ...

  4. ((ios开发学习笔记 十一))自定义TableViewCell 的方式实现自定义TableView(带源码)...

    实现的效果 实现过程 Step One 创建 自定义TableViewCell (接口部分)  (类实现部分)  xib 实现部分 注意: 下面三个设置 1 设置xib文件的class 2设置Iden ...

  5. Vue.js 学习笔记 十二 Vue发起Ajax请求

    首先需要导入vue-resource.js,可以自己下载引入,也可以通过Nuget下载,它依赖于Vue.js. 全局使用方式: Vue.http.get(url,[options]).then(suc ...

  6. Vue.js 学习笔记 十一 自定义指令

    之前看到过v-bind,v-on等指令,Vue还可以自定义指<div id="divApp"        <div v-focus></div> & ...

  7. Vue.js 学习笔记 十 自定义按键事件

    <div id="divApp"><!--任何键盘动作都会触发--><input type="text" v-on:keyup=& ...

  8. Vue.js 学习笔记 九 v-if和v-show

    <p v-if="flag">v-if</p><p v-show="flag">v-show</p> flag是 ...

  9. Vue.js 学习笔记 八 v-for

    v-for指令,是用来循环的,常用的情况有以下4种 <div id="divApp"><!--迭代数字--><p v-for="n in 5 ...

最新文章

  1. Python设置环境变量,改变GnomeConnectionManager的语言
  2. spring boot+shiro+vue前后端分离时,获取不到session
  3. Spring IoC — 基于XML的配置
  4. Queue Explorer过期处理
  5. 详解HTTP协议~~~
  6. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  7. 聊聊如何才能进大厂实习~
  8. 重磅!深度学习的顶级会议ICLR 2020 数据图文详解
  9. Java基础学习总结(114)——System之系统变量和环境变量
  10. oracle习题-emp表查询练习
  11. fastdfs原理_搭建分布式文件系统FastDFS集群
  12. 时序轮转的意思_《九州仙魔志》-烛龙:凡人的昼夜轮转,都在它眼睛开合之间...
  13. 数据库的varchar长度的限制以及对性能是否有影响
  14. php lwm2m,理解COAP/LWM2M/MQTT协议和TCP/UDP协议的关系
  15. 刷卡机显示服务器连接失败,pos密码错误_POS机常见故障代码解释
  16. CTF比赛必备常用工具
  17. C语言printf输出百分号
  18. Kaggle图像识别竞赛 Plant Seedlings Classification(植物幼苗分类)具体实现
  19. SpringBoot+Mybatis-Plus+Shiro整合的RBAC权限系统
  20. 20140419-MCSA 2012 Server R2 IntegrationService

热门文章

  1. 分布式数据库NoSQL(十)——初识Redis
  2. 计算机农业sci,科学网—SCI-EI收录农业工程期刊 - 王宝济的博文
  3. 一个学习式的mogoLink框架介绍
  4. yapi 全局变量使用_需要接口管理的你了解一下?
  5. 工作之路---记录LZ如何在两年半的时间内升为PM
  6. 关于去除CSDN上图片的默认水印
  7. veracrypt取消加密卷_VeraCrypt 加密个人隐私(便携式 )
  8. 利用CodeMirror构建在线IDE随记
  9. 使用BERT做中文文本相似度计算与文本分类
  10. php字符串处理函数大全--有时候我们只需要知道名字。