因为分析 Validator 校验器而给自己挖坑说要分析 Easy Excel 导入流程,今天终于要来填坑了。
因为内容比较多,所以分成了 Excel 2003(*.xls) 以及 Excel 2007(*.xlsx) 两种类型分析,并且分开两篇来讲,这篇先从 xls 下手。
总工程 pom.xml, Easy Excel 版本 V3.1.1,poi 版本 V5.2.2

框架这里自行引入了 poi,可以参考 官网描述 修改:

ExcelUtil框架封装了工具类 ExcelUtil,可以直接进行调用。

ExcelListener
DefaultExcelListener
DefaultExcelListener#invoke
此处只校验 ImportGroup 分组。
DefaultExcelListener#onException
ExcelResult
DefautExcelResult
DefautExcelResult#getAnalysis
TestDemoController#importData
TestDemoImportVo
导入数据:

先说明一下调用分析流程:
groups = {ImportGroup.class} 的属性字段,其他默认分组不进行校验。

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

温馨提醒,由于流程步骤较多,结合这张图走不容易迷路。
之前每次画图都可能需要 Debug 好几次才能把所有流程记录下来,不过这次想分享一个小技巧,但 注意不是所有方法都适用。
在分析异常报错时,抛出的异常如下图:

由下往上就是所有的调用流程。
好了,废话不多说,下面进入正题。
TestDemoController#importData
ExcelUtil#importExcel
EasyExcelFactory#read
ExcelReaderBuilder#sheet
ExcelReaderBuilder#build
ExcelReader#ExcelReader
ExcelAnalyserImpl#ExcelAnalyserImpl

ExcelAnalyserImpl#choiceExcelExecutor
ExcelTypeEnum#valueOf


ExcelTypeEnum#recognitionExcelType

得到文件类型为 xls,回到主方法 ExcelAnalyserImpl#choiceExcelExecutor 继续执行。

工作表 ExcelReaderSheetBuilder 构建完成:

ExcelReaderSheetBuilder#doRead
ExcelReader#read
ExcelAnalyserImpl#analysis
在前面步骤 #9 已经通过文件类型确定了是 xls 解析器。
XlsSaxAnalyser#execute
HSSFEventFactory#processWorkbookEvents

HSSFEventFactory#processEvents

HSSFEventFactory#genericProcessEvents

注:此方法是循环工作表中的数据,因为循环很多,所以我只截取其中两次(表头、行数据)来进行说明。
HSSFRequest#processRecord

FormatTrackingHSSFListener#processRecord

MissingRecordAwareHSSFListener#processRecord



XlsSaxAnalyser#processRecord
BofRecordHandler#processRecord

这里是第一次循环处理完毕返回。
当所有表头解析完成之后,会调用 DummyRecordHandler#processRecord。
DummyRecordHandler#processRecord
DefaultAnalysisEventProcessor#endRow
DefaultAnalysisEventProcessor#dealData
DefaultAnalysisEventProcessor#buildHead


ModelBuildEventListener#invokeHead

DefaultExcelListener#invokeDefaultAnalysisEventProcessor#dealData

DefaultExcelListener#invoke


ValidatorUtils#validate在前一个步骤中如果校验不通过,则会抛出异常 ConstraintViolationException

DefaultAnalysisEventProcessor#dealData
onException
DefaultAnalysisEventProcessor#onException

DefaultExcelListener#onException


HSSFEventFactory#genericProcessEvents

ExcelReaderSheetBuilder#doRead

ExcelReader#finish

ExcelAnalyserImpl#finish




ExcelUtil#importExcel

控制台只输出了校验通过的结果列表

返回自定义信息(抛出异常)DefautExcelResult#getAnalysis

控制台错误信息


至此所有流程解析完毕。