JAVA导出Excel数据量过大(50万以上)内存溢出如何解决?

薇卡 2014-11-07 04:49:13
JAVA导出Excel数据量过大(50万以上)内存溢出如何解决?
搜集了几天资料,目前知道了一些思路:
1、用临时文件,先写在临时文件中,在写入excel中
2、多文件打包
3、xml转Excel
4、多sheet

众说纷纭!却没有一个完整的,本人愚笨!点串不上!尝试各种零散方法后均失败告终!特发帖寻求解决方案,望大神们指点迷津,万分感激!
...全文
33333 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤为径_sq 2016-07-01
  • 打赏
  • 举报
回复
楼主解决了么??
  • 打赏
  • 举报
回复 1
我们公司的思路是针对大数据量导出都是导出多个文件到服务器上,然后再调用zip的压缩工具来将这几个文件进行压缩,然后再删除原文件,将压缩包发送到客户端
湍河人 2016-04-26
  • 打赏
  • 举报
回复
手机都可以65535行数…
顾小林 2016-04-25
  • 打赏
  • 举报
回复
POI可以基于事件的啊,那种的就可以 每次设置读取数量就OK
hcy370037 2016-04-25
  • 打赏
  • 举报
回复
楼主如歌解决的?有没有具体源码?遇到同样问题 数据过大 导出不显示
ligaofu 2016-01-06
  • 打赏
  • 举报
回复
按照9楼的方案,已经解决问题,好开心~ ps:jdk配置512m内存, 表格每行 43个字符串字段,100万行,14分钟26秒成功导入~
异常异长 2014-11-12
  • 打赏
  • 举报
回复
lousang123 2014-11-12
  • 打赏
  • 举报
回复
我之前试过导出20w的,可是sheet有65535上限,另new sheet结果怎么sheet可以建立就是不进数据... 客户催的急,后来只能暂时变通着导出多张excel了。。
夏天的圈圈 2014-11-12
  • 打赏
  • 举报
回复
引用 5 楼 littlebrain4solving 的回复:
你把50W条数据分批次查询到内存后利用POI来写入,如果POI不支持分批次写流,你参考POI源码进行修正。
这个应该可以,靠谱,分批写入,java poi
loveunittesting 2014-11-11
  • 打赏
  • 举报
回复
poi3.8以上没有问题,看看我的博客里有。
xcmzc 2014-11-11
  • 打赏
  • 举报
回复
写个循环 判断每次导多少条数据就清空下流。
kevin-go 2014-11-10
  • 打赏
  • 举报
回复
用物理缓存来写应该可以
咖啡加糖_ 2014-11-10
  • 打赏
  • 举报
回复
引用 6 楼 fanqiezz11 的回复:
[quote=引用 1 楼 jimmy609 的回复:] 方案1 我不清楚 方案2 这个问题我碰到过,当时我导出生成多个excel然后打包出来的,这个是可行的 方案3 也是可行的,但是我没试过, 方案4 这个方案整体思路和方案2是一样的,也是先生成excel 写了一个sheet'后,重新再去写这个excel
那你打包的代码能传上分享下么?不方便的话传关键代码也行![/quote] http://download.csdn.net/detail/jimmy609/5840061#comment http://blog.csdn.net/jimmy609/article/details/9629301 之前总结的,代码稍乱,自己整理下吧~~~
薇卡 2014-11-10
  • 打赏
  • 举报
回复
引用 1 楼 jimmy609 的回复:
方案1 我不清楚 方案2 这个问题我碰到过,当时我导出生成多个excel然后打包出来的,这个是可行的 方案3 也是可行的,但是我没试过, 方案4 这个方案整体思路和方案2是一样的,也是先生成excel 写了一个sheet'后,重新再去写这个excel
那你打包的代码能传上分享下么?不方便的话传关键代码也行!
suciver 2014-11-10
  • 打赏
  • 举报
回复
要么多个sheet要么多个excel文件,我记得一个sheet好像只能写65535行
t13523417 2014-11-10
  • 打赏
  • 举报
回复
方案一:poi最新版已经解决了这个问题,导出过几十万的,没有问题: 关键性代码如下:
FileOutputStream fOut = new FileOutputStream(savePath);
Workbook workbook = new SXSSFWorkbook(500);//每次缓存500条到内存,其余写到磁盘。
Sheet sheet = workbook.createSheet();
官网案例地址:http://poi.apache.org/spreadsheet/how-to.html#sxssf 方案二:客户没有特别指定,可以使用csv格式的excel,轻量型的导出方式。 方法:自己新建一个csv格式的excel,然后右键编辑查看。看完之后你就明白了,csv其实就是一个txt文本,纯字符串拼接。 接下来当成txt文件来读或写就可以了。
  • 打赏
  • 举报
回复
你把50W条数据分批次查询到内存后利用POI来写入,如果POI不支持分批次写流,你参考POI源码进行修正。
  • 打赏
  • 举报
回复
不知道POI写Excel流的时候能不能分开写;分批次写进,不要让内存占用太大。
Mr_JieLQ 2014-11-07
  • 打赏
  • 举报
回复
50万以上已经是非常大的数据量了,建议根据可分段的数据库字段分批次查,例如,如果有时间字段,可把这个连续的时间分成几段
a2048 2014-11-07
  • 打赏
  • 举报
回复
关注,我也遇到这个问题。
加载更多回复(1)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧