前言:
目前兄弟们对“java读取excel文件内存溢出”大体比较重视,朋友们都需要了解一些“java读取excel文件内存溢出”的相关资讯。那么小编同时在网络上网罗了一些有关“java读取excel文件内存溢出””的相关内容,希望同学们能喜欢,咱们一起来了解一下吧!前言:应用于在原有excel基础上,对解析失败行进行标记处理,仅提供思路,若有不足还望指正。
一、什么是Easyexcel
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
所需依赖
二、读Excel
1. 关联对象
创建对象的属性数据类型需要与excel单元格中数据类型相同,如日期,数字需要格式转换可参考官方文档自定义格式转换。
2. 编写监听器
定义一个类实现ReadListener接口,并且重写invoke(),doAfterAllAnalysed(),onException()方法。
因为ReadListener不能被spring管理,每次使用都需要new出来,所以如果需要使用springBean对象可以通过构造器注入。
invoke()方法为每解析excel中一行数据都会执行的方法,可以在此方法中对解析后得到的对象中的数据进行数据校验,在这里就可以对校验有误的数据进行记录行号。
在demo中,本次还定义了BATCH_COUNT和cachedDataList,BATCH_COUNT用来限制最多读取多少条数据同时插入到数据库中,避免一条条插入资源浪费。cachedDataList即对未达到最大数量前所读取到数据的临时缓存。每进行一次插入后都需要对cachedDataList进行清理
onException()方法是在invoke()方法解析抛出异常时执行的方法,在方法的入参context中可以获取抛出异常的行数,列数以及数据,可以通过记录行号进行标记。
doAfterAllAnalysed()方法是在所有数据都解析完之后触发执行,可以在此处进行最后的数据插入操作,并且清理集合。然后对所统计的到的结果进行统计处理。
三、结果统计思路
通过在监听器中定义一个集合,用于临时缓存onException方法执行时所获得的行号,然后存储到异常行号集合中,在最后执行doAfterAllAnalysed()方法时通过异常集合中的行号对文件中对应的行进行标记处理。因为Easyexcel依赖了poi,所以可以直接通过poi的依赖直接在指定行的最后一列添加处理失败的逻辑,如此便可以在不创建新的excel文件的前提下,对上传的excel文件进行解析结果处理。最后便可以将处理后的excel文件进行导出。
标签: #java读取excel文件内存溢出