【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
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第1张图片
框架这里自行引入了 poi,可以参考 官网描述 修改:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第2张图片

2、框架集成公共部分

2.1、Excel 操作工具类 ExcelUtil

框架封装了工具类 ExcelUtil,可以直接进行调用。
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第3张图片

2.2、导入监听接口 ExcelListener

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第4张图片

2.3、默认监听器 DefaultExcelListener

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第5张图片

2.3.1、数据处理方法 DefaultExcelListener#invoke

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第6张图片
此处只校验 ImportGroup 分组。

2.3.2、异常处理方法 DefaultExcelListener#onException

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第7张图片

2.4、Excel 结果接口 ExcelResult

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第8张图片

2.5、默认 Excel 结果对象 DefautExcelResult

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第9张图片

2.5.1、导入结果 DefautExcelResult#getAnalysis

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第10张图片

3、导入测试方法

3.1、导入测试接口 TestDemoController#importData

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第11张图片

3.2、导入对象 TestDemoImportVo

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第12张图片
导入数据:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第13张图片

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

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

4、接口测试

4.1、导入成功

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第14张图片

4.2、导入存在异常

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第15张图片

执行流程分析

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

为了便于理解和对比,所以我把两种类型文件的导入流程画在了一张图里面,很多流程是相同的,不同的地方用不同的颜色进行了区分,但是为了简洁和突出重点,并不是每一层都详细列了出来(中间省略了一些不太重要的深入调用,在下面 Debug 分析里面会把截图放出来)。
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第16张图片
温馨提醒,由于流程步骤较多,结合这张图走不容易迷路

2、(#1)TestDemoController#importData

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第17张图片

3、(#2)ExcelUtil#importExcel

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第18张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第19张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第20张图片

6、(#6)ExcelReaderBuilder#build

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第21张图片

7、(#7)ExcelReader#ExcelReader

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第22张图片
ExcelAnalyserImpl#ExcelAnalyserImpl
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第23张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第24张图片

8.1、获取 Excel 文件类型

ExcelTypeEnum#valueOf
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第25张图片
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第26张图片
由上图,Easy Excel 底层是根据魔数(Magic Number)确定文件类型。搜索一下 xlsx 文件的魔数:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第27张图片
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第28张图片
插一个热知识:Java *.class 文件的魔数是 cafe babe

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

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

得到文件类型为 xlsx,回到主方法 ExcelAnalyserImpl#choiceExcelExecutor 继续执行。
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第29张图片
工作表 ExcelReaderSheetBuilder 构建完成:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第30张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第31张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第32张图片

11、(#11)解析 ExcelAnalyserImpl#analysis

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第33张图片
在前面步骤 #9 已经通过文件类型确定了是 xlsx 解析器。

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第34张图片
当前文件只有工作表 sheet1 有数据。
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第35张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第36张图片
JAXPSAXParser#parse
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第37张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第38张图片
XMLParser#parse
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第39张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第40张图片
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第41张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第42张图片
do...while 循环里面也有 next() 方法:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第43张图片

16.1、XMLDocumentFragmentScannerImpl.Driver#next

next() 方法根据不同的事件有不同的实现类:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第44张图片
XMLDocumentScannerImpl#next
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第45张图片
举几个例子(不同事件的 next() 实现方法):
XMLDeclDriver#next
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第46张图片
PrologDriver#next
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第47张图片
还有结束行调用的 FragmentContentDriver#next

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第48张图片
XMLDocumentFragmentScannerImpl#scanEndElement
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第49张图片
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第50张图片
AbstractSAXParser#endElement
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第51张图片

18、(07#7)XlsxRowHandler#endElement

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第52张图片
XlsxRowHandler#endElement
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第53张图片

19、(07#8)RowTagHandler#endElement

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第54张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第55张图片

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

21.1、构造表头

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第56张图片
DefaultAnalysisEventProcessor#buildHead
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第57张图片
DefaultAnalysisEventProcessor#dealData
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第58张图片
ModelBuildEventListener#invokeHead
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第59张图片

21.2、(#14)行数据解析

DefaultAnalysisEventProcessor#dealData
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第60张图片
DefaultExcelListener#invoke
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第61张图片

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

在前一个步骤中如果校验不通过,则会抛出异常 ConstraintViolationException
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第62张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第63张图片

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

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第64张图片

DefaultAnalysisEventProcessor#onException
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第65张图片

DefaultExcelListener#onException
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第66张图片
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第67张图片

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

XlsxSaxAnalyser#execute
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第68张图片
DefaultAnalysisEventProcessor#endSheet
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第69张图片
DefaultExcelListener#doAfterAllAnalysed
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第70张图片

26、(#17)完成读取

ExcelReaderSheetBuilder#doRead
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第71张图片
ExcelReader#finish
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第72张图片
ExcelAnalyserImpl#finish
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第73张图片
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第74张图片

27、(#18)返回结果

【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第75张图片

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

ExcelUtil#importExcel
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第76张图片
控制台只输出了校验通过的结果列表:
在这里插入图片描述
返回自定义信息(抛出异常)DefautExcelResult#getAnalysis
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第77张图片
控制台错误信息:
【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)_第78张图片
至此所有流程解析完毕。

你可能感兴趣的:(框架学习,-,若依,/,RuoYi-Vue-Plus,RuoYi-Vue-Plus,java,easyexcel,后端)