上一篇博客 写了 Excel 2003(*.xls)
文件的导入,这篇是 Excel 2007(*.xlsx)
,虽然有一些流程是重复的,但还是会一步步列举出来。
这一部分和上一篇博客是一样的,可以跳过直接看流程。
总工程 pom.xml
, Easy Excel 版本 V3.1.1
,poi 版本 V5.2.2
框架这里自行引入了 poi,可以参考 官网描述 修改:
ExcelUtil
ExcelListener
DefaultExcelListener
DefaultExcelListener#invoke
DefaultExcelListener#onException
ExcelResult
DefautExcelResult
DefautExcelResult#getAnalysis
TestDemoController#importData
TestDemoImportVo
先说明一下调用分析流程:
groups = {ImportGroup.class}
的属性字段,其他默认分组不进行校验。为了便于理解和对比,所以我把两种类型文件的导入流程画在了一张图里面,很多流程是相同的,不同的地方用不同的颜色进行了区分,但是为了简洁和突出重点,并不是每一层都详细列了出来(中间省略了一些不太重要的深入调用,在下面 Debug 分析里面会把截图放出来)。
温馨提醒,由于流程步骤较多,结合这张图走不容易迷路。
TestDemoController#importData
ExcelUtil#importExcel
EasyExcelFactory#read
ExcelReaderBuilder#sheet
ExcelReaderBuilder#build
ExcelReader#ExcelReader
ExcelAnalyserImpl#ExcelAnalyserImpl
ExcelAnalyserImpl#choiceExcelExecutor
ExcelTypeEnum#valueOf
由上图,Easy Excel 底层是根据魔数(Magic Number)确定文件类型。搜索一下 xlsx 文件的魔数:
插一个热知识:Java *.class
文件的魔数是 cafe babe
。
其他类型文件魔数请参考以下网站:
https://www.garykessler.net/library/file_sigs.html
得到文件类型为 xlsx
,回到主方法 ExcelAnalyserImpl#choiceExcelExecutor
继续执行。
工作表 ExcelReaderSheetBuilder
构建完成:
ExcelReaderSheetBuilder#doRead
ExcelReader#read
ExcelAnalyserImpl#analysis
在前面步骤 #9
已经通过文件类型确定了是 xlsx 解析器。
XlsxSaxAnalyser#execute
XlsxSaxAnalyser#parseXmlSource
AbstractSAXParser#parse
XML11Configuration#parse
XMLDocumentFragmentScannerImpl#scanDocument
XMLDocumentFragmentScannerImpl.Driver#next
next()
方法根据不同的事件有不同的实现类:
XMLDocumentScannerImpl#next
举几个例子(不同事件的 next()
实现方法):
XMLDeclDriver#next
PrologDriver#next
还有结束行调用的 FragmentContentDriver#next
。
FragmentContentDriver#next
XMLDocumentFragmentScannerImpl#scanEndElement
AbstractSAXParser#endElement
XlsxRowHandler#endElement
RowTagHandler#endElement
DefaultAnalysisEventProcessor#endRow
DefaultAnalysisEventProcessor#dealData
DefaultAnalysisEventProcessor#buildHead
DefaultAnalysisEventProcessor#dealData
ModelBuildEventListener#invokeHead
DefaultAnalysisEventProcessor#dealData
DefaultExcelListener#invoke
ValidatorUtils#validate
在前一个步骤中如果校验不通过,则会抛出异常 ConstraintViolationException
DefaultAnalysisEventProcessor#dealData
onException
DefaultAnalysisEventProcessor#onException
DefaultExcelListener#onException
XlsxSaxAnalyser#execute
DefaultAnalysisEventProcessor#endSheet
DefaultExcelListener#doAfterAllAnalysed
ExcelReaderSheetBuilder#doRead
ExcelReader#finish
ExcelAnalyserImpl#finish
ExcelUtil#importExcel
控制台只输出了校验通过的结果列表:
返回自定义信息(抛出异常)DefautExcelResult#getAnalysis
控制台错误信息:
至此所有流程解析完毕。