Java导出一百万数据到Excel

前一篇文章写了导出Excel并加密,后来我师傅让我尝试100w的数据量,然后就开始动手了,原来的方法肯定不行,虚拟机就直接给炸了,而且效率特别低,到40w左右的数据的时候,就跑不动了。用户体验也是极差的。同时数据时从数据库导出来的,用泛型则会更好的利用反射,就不用像上篇那样,还得放2个集合了。PS:应为我要对从数据库取出来的数据进行计算和处理,所有光用网上说的SXSSF来写入数据时肯定不行的,故用到了下面的思路:

1.为了提高效率,则要用到多线程,用到多线程,自然不能是一张表了,不然数据都紊乱掉了;同时我想过一个线程跑一个sheet,但是失败, 代码上不允许,不知道是不是我的方法不对,至今未成功,如果有成功的大佬希望能分享给我哇~

2.多张表的话,则是一个线程跑一张表了,但是这里不能用要线程池,因为你不知道线程池里哪个线程跑的是哪部分数据,这样也会紊乱了,只有循环建立多线程的方式,来确保某个线程跑的是哪个部分的数据。

3.既然分了多张表,那读取数据的时候就用分页方法去读好了,不然每次都传一个100w的list也是很麻烦的事情。

4.而分了多张表,不可能通过一个outputstream返回给用户,所以就得放到一个文件里,然后进行压缩,以压缩包的形式返回给用户。

5.用压缩包的话,会出现个问题,那就是多线程在写到时候,可能就会触发下面压缩方法进行压缩了,这里便用到CountDownLatch,每写完一个,就调用其countDown()方法,等所有的线程都写完了,再调用await()

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值