从实际上看,笔者之前的项目用的Excel表格工具类,是一个单线程的工具类,执行效率比较慢。
在生成Sheet,1W行数据时,花费大概在10秒左右,多Sheet数据量叠加,时间开销也会线性叠加。
笔者项目用的框架是阿帕奇开源的POI,本篇文章的主体聚焦于优化的思路,如POI的使用、线程池细节、并发工具类的使用等,不在讨论范围。
在生产环境,通过以下优化之后,生成Excel的速度能快上好几倍(产品赶紧给我加鸡腿)。
分Sheet优化
Excel表格中,不同的sheet应该没有什么关联关系,起码对于笔者的项目是这样的。
所以优化的第一步,就是把不同的sheet放在不同的线程池中跑,伪代码如下:
void excel(){
//创建excel文件对象
XSSFWorkbook workbook = new XSSFWorkbook();
//表格的数据,第一层为sheet的数量,第二层为每个sheet中的数据
List<List<String>> data = new ArrayList();
//cdl用以实现同步
CountDownLatch cdl = new CountDownLatch(data.size())<