
在使用 POI 导出一千万行数据到 Excel 时,CPU 长时间爆炸
现在的解决方案是:
现已探明的问题:
一千万的数据在创建 Excel 前都存储在 list 中,当 list 占用内存很小时,导出很快,一旦 list 变得很大,分段导出都会变的很慢
1 mhycy Aug 11, 2021 先不说导出,就是成功导出了,这千万级数据的 Excel 有办法开么 |
3 fengpan567 Aug 11, 2021 为什么要搞一个 1000W 大小的 list 出来,不能分页查吗? |
4 40aU4RaW20xf8hXn Aug 11, 2021 搞明白客户的真实需求吧. |
5 7925250 Aug 11, 2021 可以改造成流式导出,一千万的数据 (1.3GB) 导出,耗时 2 分钟 |
6 wangkun025 Aug 11, 2021 Excel 目前单个 sheet 只能容纳 104 万行。不过可以分 sheet,sheet 数量没有限制。 |
7 chendy Aug 11, 2021 直接走数据库查询导出 csv 吧 |
8 MidGap Aug 11, 2021 曾经踩过内存溢出的坑,就是用使用 SXSSFWorkbook 类这个方法解决的,但是这样 IO 好像就会变密集,慢也是无法避免的。。 本身这个需求感觉就很扯淡,使劲 battle 一下多好~ 或者用 csv 啊,简单多了 |
9 MidGap Aug 11, 2021 @fengpan567 excel 的 append 操作很坑,要先读到内存再往下写我记得 |
10 aguesuka Aug 11, 2021 直接导出 csv 文件, 能提出导出 1000 万行 excel 数据的客户估计也分不清这两种数据的区别 |
11 franklinray Aug 11, 2021 导出 1000 万行 excel,一般电脑都打不开吧。打开了谁能去查看数据……如果只是为了导出数据,然后导入其他系统做分析,换成 csv 不好吗 |
12 binsys Aug 11, 2021 我处理大量 EXCEL 数据用 MS 的 OPENXMLSDK ,在直接以 XML SAX 形式写入 |
13 pengtdyd Aug 11, 2021 什么样的电脑可以打开 1000w 的 excel,很难想象 |
14 jzphx Aug 11, 2021 easyexcel 尝试用过了吗 |
15 liuxu Aug 11, 2021 这种阔气的问题,只有 java 节点提的出来 |
16 xuanbg Aug 11, 2021 50 万行的 excel,我 i9/32G 的 mbp 打开是能打开,但很费劲。100 万行是想都不敢想,何况 1000 万行。SB 客户不能惯着 |
17 7228897 Aug 11, 2021 单位的电脑 4G 内存,打开 40 万条的月数据已经卡的不能动了 |
18 simple2025 Aug 11, 2021 1KW 估计内存会炸把 |
19 EscYezi Aug 11, 2021 via iPhone 之前用 easyExcel 看官网说是擅长导出大量数据,楼主可以体验一下 |
20 jorneyr Aug 12, 2021 这是要把整个数据库都给搬家了 |
21 Kimen OP @fengpan567 数据实时在产生,分页查会导致第二页和第一页数据有重复 |
23 Kimen OP @jzphx 没有用过 easyexcel,我看文档 easyexcel 是基于注解的,但是我的数据流是 List<Map<String, Object>>这种形式的,不知道能不能用 |
25 Kimen OP @franklinray csv 就怕遇到逗号,用户在导出之前也不知道自己能不能打开,就想看看能不能导出来。看来我要跟领导提一下,限制用户的导出数量 |
27 A1exlee Aug 12, 2021 不建议一次性将一千万数据加载到 list,可以考虑分页读库,比如每次 load 100 万条,然后写入一个 excel,分开写 10 个 excel,通过编号确认顺序,最后客户端打包下载。 |
29 spLite Aug 12, 2021 数据库导出 Excel 或者 csv,应用程序只负责把导出的文件传输给用户。 “用户在导出之前也不知道自己能不能打开” 可以先手动搞一个 1000W 的 Excel 让客户打开看看么,如果他自己看下打开费劲,说不定自己就否了这方案了。 |
30 doudou1523102 Aug 12, 2021 建议分批导出,然后进行压缩 |
31 kifile Aug 12, 2021 csv 不是也可以用 excel 打开吗?还是流式卸乳的,考虑考虑 |
32 speedofstephen Aug 12, 2021 poi 有流式 api 写 excel 的。建议不要全量放在 list 中 |
33 lwjef Aug 12, 2021 创建个占用空间很大的假 excel,反正用户打不开。(doge |
35 onionKnight888 Aug 12, 2021 @liuxu 哈哈 你永远无法理解客户的需求有多奇葩 |
36 zhenglin Aug 12, 2021 建议导出为多个 csv 再压缩成 zip 文件,SB 需求不能接!再说千万数据在一个 Excel 里他如果是普通电脑能打开么? |
37 2bNot2b Aug 12, 2021 excel 有行数上限,我记得 xls 是 10W 多吧,xlsx 是 1048576 |
38 wqhui Aug 12, 2021 上面三个方法我当时都用了,poi 我记得有个流模式,类似于窗口控制,读一部分写一部分这个会快很多,忘了是不是叫 SXSSFWorkbook,但占内存还是挺多的,我当时三百万记录差不多耗 2G 内存,不过为什么不分几个 excel 文件然后打成压缩包呢,excel 太大打开可能会崩溃 |
39 aitaii Aug 12, 2021 excel 很大,你的电脑忍一下 |
40 Lemeng Aug 12, 2021 千万级,客户也是秀逗 |
41 kg2019 Aug 12, 2021 easyExce 了解一下 |
42 levon Aug 12, 2021 分文件吧,存在一个 excel 里干吗用 |
43 jack778 Aug 12, 2021 那么大弄成一个文件怎么操作呢,客户的电脑配置有多牛呢 |
44 Hallelu Aug 12, 2021 之前跟一个客户做 excel 导出的功能,他说数据多,直接给他声明,单个 excel 超过一百万,不做.... |
45 est Aug 12, 2021 .csv 斥候 |
46 dayeye2006199 Aug 12, 2021 建议走 tsv + 份文件 + 压缩的路线吧。 excel 虽然很牛。。但也不是万能的。 |
47 Vegetable Aug 12, 2021 实际上,这个性能瓶颈时 Excel 本身带来的,Excel 天生不适合大规模数据,导出到 Excel 是一个非常耗时的操作。建议不要分 Sheet,而是分工作簿。 |
48 rockddd Aug 12, 2021 easyexcel 导出 List<Map<String, Object>> 这种格式的 我昨天刚写完 |
49 wxy1991 Aug 12, 2021 除了 easyexcel 还有个 eec,不用依赖 poi,效率比 easyexcel 还要高,不过你这很明显需求不合理,1000w 的 excel 我就不信有电脑能打开,我的破电脑打开个 500m 的 word 感觉就要卡死了 |
50 someonedeng Aug 12, 2021 真给他导出了,他怎么打开? 能不能分成多个 excel 文件再打包 zip ? |
51 beginor Aug 13, 2021 via Android 软件工程师,多动脑子,不是程序猿。 |
52 dcncy Aug 13, 2021 via iPhone 之前做过一个 700w+的数据导出,每一行 40 多列。 使用的是 easyExcel 导的,分多个 excel,多个 sheet,多线程跑效率能快点。 |
53 janda Aug 13, 2021 |