POI 如何快速导出千万级数据的 Excel

2021-08-11 17:26:37 +08:00
 Kimen

在使用 POI 导出一千万行数据到 Excel 时,CPU 长时间爆炸💥
现在的解决方案是:

现已探明的问题:
一千万的数据在创建 Excel 前都存储在 list 中,当 list 占用内存很小时,导出很快,一旦 list 变得很大,分段导出都会变的很慢

5365 次点击
所在节点    Java
53 条回复
Kimen
2021-08-12 08:06:35 +08:00
@fengpan567 数据实时在产生,分页查会导致第二页和第一页数据有重复
Kimen
2021-08-12 08:07:21 +08:00
@chendy csv 碰到数据里面带逗号的都懵逼了
Kimen
2021-08-12 08:10:01 +08:00
@jzphx 没有用过 easyexcel,我看文档 easyexcel 是基于注解的,但是我的数据流是 List<Map<String, Object>>这种形式的,不知道能不能用
chendy
2021-08-12 08:10:58 +08:00
@Kimen #22 能转义,不用程序实现直接用数据库的导出功能
Kimen
2021-08-12 08:11:30 +08:00
@franklinray csv 就怕遇到逗号,用户在导出之前也不知道自己能不能打开,就想看看能不能导出来。看来我要跟领导提一下,限制用户的导出数量
Kimen
2021-08-12 08:13:18 +08:00
@jorneyr 心里已经锤死客户一千万遍了
A1exlee
2021-08-12 09:06:38 +08:00
不建议一次性将一千万数据加载到 list,可以考虑分页读库,比如每次 load 100 万条,然后写入一个 excel,分开写 10 个 excel,通过编号确认顺序,最后客户端打包下载。
fpure
2021-08-12 09:21:22 +08:00
@MidGap SXSSFWorkbook 还要记得清理硬盘缓存,也是坑
spLite
2021-08-12 09:31:53 +08:00
数据库导出 Excel 或者 csv,应用程序只负责把导出的文件传输给用户。
“用户在导出之前也不知道自己能不能打开” —— 可以先手动搞一个 1000W 的 Excel 让客户打开看看么,如果他自己看下打开费劲,说不定自己就否了这方案了。
doudou1523102
2021-08-12 09:42:38 +08:00
建议分批导出,然后进行压缩
kifile
2021-08-12 10:06:25 +08:00
csv 不是也可以用 excel 打开吗?还是流式卸乳的,考虑考虑
speedofstephen
2021-08-12 10:15:06 +08:00
poi 有流式 api 写 excel 的。建议不要全量放在 list 中
lwjef
2021-08-12 10:28:12 +08:00
创建个占用空间很大的假 excel,反正用户打不开。(doge
MidGap
2021-08-12 10:28:32 +08:00
@Kimen CSV 的分隔符可以指定,不一定非要逗号的。。
onionKnight888
2021-08-12 11:05:26 +08:00
@liuxu 哈哈 你永远无法理解客户的需求有多奇葩
zhenglin
2021-08-12 11:26:02 +08:00
建议导出为多个 csv 再压缩成 zip 文件,SB 需求不能接!再说千万数据在一个 Excel 里他如果是普通电脑能打开么?
2bNot2b
2021-08-12 11:37:57 +08:00
excel 有行数上限,我记得 xls 是 10W 多吧,xlsx 是 1048576
wqhui
2021-08-12 11:56:00 +08:00
上面三个方法我当时都用了,poi 我记得有个流模式,类似于窗口控制,读一部分写一部分这个会快很多,忘了是不是叫 SXSSFWorkbook,但占内存还是挺多的,我当时三百万记录差不多耗 2G 内存,不过为什么不分几个 excel 文件然后打成压缩包呢,excel 太大打开可能会崩溃
aitaii
2021-08-12 12:24:46 +08:00
excel 很大,你的电脑忍一下
Lemeng
2021-08-12 13:26:11 +08:00
千万级,客户也是秀逗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/795136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX