EasyExcel对Excel文件的解析过程

POI与easyExcel的区别:

POI是通过WorkBook来解析表格文件的,虽然内部有使用到Sax模式,能后大大的提高效率,但是要解析大文件(10w,100w行)的话很容易出现OOM(内存溢出)。
相比之下,
1、easyExcel解析实在磁盘上进行的,几乎可以将几mb级别的内存压缩到kb级别,几乎不用担心OOM;
2、用Java模型进行关系映射,项目中最常用的就Java模型映射,通过 @ExcelProperty注解就可以完成行与列的映射;
3、easyExcel中有一个类AnalysisEventListener,里面有一个方法invoke实现了一行一行返回,另外还可以重写该类的doAfterAllAnalysed方法,用来做事后处理之类的操作,相当的灵活。

执行原理:

ExcelAnalyserImpl是解析器的真正实现,整合了v07好人v03,解析的时候会根据getSaxAnalyser来选择使用哪种版本的解析器

第一步:自定义监听类ExcelListener继承于AnalysisEventListener,重写invoke()方法(可以读取到excel每一行的数据)和doAfterAllAnalysed()方法(用于后置处理),其中datas用于存取读取到的数据,importHeads为导入表头,modelHeads是模板表头

 第二步:

通过ExcelAnalyserImpl()构造方法,将inputstream(也就是file文件)和自定义的监听器eventListener(继承于AnalysisEventListener) 存入ExcelAnalyserImpl类的AnalysisContext属性当中

 通过analysis()方法获取Excel是.xls还是.xlsx类型,再用appendListeners()方法封装默认的监听器和自定义的监听器到BaseSaxAnalyser类的listeners属性中

 第三步:SAX事件解析器DefaultHandler类(核心类)会依次执行startDocument()、startElement()、characters()、endElement()、endDocument()方法

 XlsxRowHandler继承了DefaultHandler类,并将读到的数据存入curRowContent属性和curCol属性等

 

 然后

猜你喜欢

转载自www.cnblogs.com/gwtjava/p/11937777.html