onlyliuxin / coding2017

218 stars 643 forks source link

利用多线程将大量数据写入Excel #518

Open MedalJiao opened 7 years ago

MedalJiao commented 7 years ago

有一个报表的业务需求是导出excel文件(仅一个sheet),包含了大量的文本信息和图片(图片需要写入单元格),由于数据量大,我尝试用多线程,但是发现在写入数据和写入图片时候,必须得给线程加锁,这样一来,写数据这个制约下载速度的问题还是没能解决,同时由于数据量确实大,workbook.write(stream)这一步非常耗时,大家谁有类似问题的解决经验,希望不吝赐教。

MedalJiao commented 7 years ago

比如说用户每个月需要拉一次报表,每次有1万条数据,每条数据最多10张照片(照片用卡片机拍摄,用户要求不能压缩),这样算下来几万张照片,总文件大小超过1G

onlyliuxin commented 7 years ago

能不能写多个excel, 然后合并excel ?

michaelssss commented 7 years ago

参考下载软件多线程下载,预先创建小块,最终做合并操作。另外压力主要是IO,先上了SSD再说

Yiend commented 7 years ago

试试 用2个sheet,一个线程 往一 个sheet写入信息,一个线程 往另一个sheet 写入图片,一个线程挂起等待,等信息 和图片都写完后 唤醒挂起的线程 做合并

ericwang1984 commented 7 years ago

总文件大小超过1G,就是创建成功了,之后怎么打开呀。。这体验。。。

MedalJiao commented 7 years ago

@onlyliuxin 老师,写多个excel合并成一个excel,可以解决一次性写入大数据流的问题,合并不同excel到同一个这块从网上没找到好的解决方案,您那有相关的经验吗

MedalJiao commented 7 years ago

@lixiaobai2 考虑过写到两个sheet中,但是有两个问题:1、图片和文本信息对应问题,要正确对应就需要保证两个sheet写入数据的顺序相同;2、合并两个sheet的处理还是需要读取一个sheet的数据写入另外一个sheet,理想的是读取文本的sheet写入图片的那个sheet,但是最后还是需要将流写入workbook,是这样吗

MedalJiao commented 7 years ago

@michaelssss 难点就在合并成一个完整可用的excel,这里没想到方案,换硬盘可行性太低,公司抠门,业务又需要必须导出,目前导出千八百条带图片的倒是可以,导出上万条就直接卡住了

Yiend commented 7 years ago

@brucejiao1 你可以用程序 确保每一条信息 和图片都没写入成功后,再执行下一条数据, 这样就能保证 sheet1 和sheet2的数据对应一致,并且按规定的 单元格存储,合并sheet1和sheet2 的时候 就方便多了

MedalJiao commented 7 years ago

@lixiaobai2 谢谢,我找下合并多个sheet的示例

Wrecksoul commented 7 years ago

多线程写的话,可以划分好每个线程的区域,这样不会出现需要加锁的情况,最多出现“木桶最短板”的情况,只要你控制好每个线程分配的行数就可以达到尽量大的速度。