前言:
excel导出其实是很常见的一个需求,之前一直都是傻傻的用apache的POI来写,用起来很复杂。最近发现网上其实还有一些前人写好的轮子,于是瞬间投入了他们的怀抱(主要是简单易用!!!)
选型:
网上关于excel的开源框架比较流行的有两种:EasyPOI、EasyExcel。
EasyPOI api文档:http://easypoi.mydoc.io/
EasyExcel 文档:https://alibaba-easyexcel.github.io/
仔细看了下api文档发现easypoi其实支持的功能比较多,编辑excel格式、校验excel模板等功能都很完善,而且都是使用注解,对于使用者而言更加方便(亲自测试过)。EasyExcel好像就是单纯的进行读取和导入,其他功能并不完善。
但是针对大数据导出的话easypoi要调用单独的方法,easyexcel的话导出就是同一个方法。比较方便。
Bug:当前版本的easypoi的大数据导出好像有bug,和poi的版本似乎有冲突,使用不了。但是easyexcel可以,所以对于大数据的导出我使用的是easyExcel,excel模板校验和读取我还是用的easyPoi。(我也想统一用easypoi啊啊啊)
easypoi版本:
大数据导出:
其实api文档都有很详细的demo。我这里主要是对大数据导出中的流程做一个总结(分页查询 - 循环导入)
1、查询出此次要导出的数据量count,根据count和自定义的每次查询数量size(我是10000)来计算出一共要查询n次。(防止一次查询数据量过大导致OOM)
2、循环n次,每次查询size大小的数据。然后导出到同一个sheet的excel中。注意,每次循环完clear掉list数据,防止占用内存
3、循环中会有一个问题,就是你在循环过程中别人新插入了数据怎么办,我的做法是最开始查询count的时候根据创建时间排序,获取最新的创建时间,然后后面的循环都使用这个创建时间作为搜索条件。这样就只会查询到和count相符合的数据了。
ps:导出数据超过6w条的时候excel格式为xlsx。不然easypoi普通的导出超过6w条数据会自动换sheet,使用easyexcel就会出错。