POI的两种模式
对于Excel的读取,POI有两种模式,第一种是用户模式,使用比较简单,是将文件一次性读到内存,这种模式在文件比较大的情况下会有OutOfMemory内存溢出的情况。第二种是事件驱动模式,excel的内容是使用XML的格式存储的,处理excel就是解析XML,而目前使用事件驱动模式解析XML的API是SAX(Simple API for XML),这种模型在读取XML文档时,并没有将整个文档读入内存,而是按顺序将整个文档解析完,在解析过程中,会主动产生事件交给程序中相应的处理函数来处理当前内容。因此这种方式对系统资源要求不高。
事件模式解析步骤
- 通过文件路径或者Inputstream调用OPCPackage的open方法生成OPCPackage实例
- 通过OPCPackage实例创建XSSFReader实例对象
- 通过XSSFReader实例对象获取共享的字符串表
- 创建XMLReader实例对象,使用SAX进行解析取共享的字符串表,并设置内容处理器
- 开始处理
示例代码
目标
解析一份大数据量的用户名+电话的excel,将解析出来的数据放入List集合中,格式如图:
实体类 AiMobileTemp
|
|
Excel事件解析类 ExcelXlsxReader类
|
|
事件实现接口 ExcelReader
|
|
事件实现具体逻辑类 AiMobileExcelReader
|
|
方法调用类 AiTaskServiceImpl
|
|
小结
以上代码基本实现了excel大批量数据导入的需求,不会发生内存溢出的情况了,但还有不少地方可以优化和封装,需要进一步完善。