`
run_xiao
  • 浏览: 192320 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java往Excel写入海量数据

    博客分类:
  • Java
阅读更多
最近需要往Excel写入海量数据,大约10W笔左右(超过6万会新建一个sheet再写)

开始使用POI的包,写1W笔左右就out of memory了

后来换用jxl,写1.8w笔左右报out of memory
(我机器配置Pentium(R)D 3GHZ,双核,内存1G)

考虑到分批次写是否会好一些,每次先把数据写到一个临时文件,然后关闭流

再将临时文件读入后再往里写,可是发现这样还是不行

用jprofiler看了看内存使用状况,发现其实数据本身占空间并不是很大,而是每

一个cell会产生很多相关的对象(不管是POI还是jxl,jxl资源释放会快一些),

这些对象比数据本身占的空间要大得多,更郁闷的是即便是读入一个Excel文件,

也会为有值得cell自动产生这些对象

所以分批次写也行不通,因为中间产生的临时文件读入进来也可能耗光内存

现在能想到的解决方案:1.加内存,客户不乐意

2.替换成csv格式的文本,客户说这样产生文件数量太多也不乐意

不知各位还有什么高见?

谢谢


分享到:
评论
20 楼 juluren 2013-02-04  
参考http://apidoc.cn/archives/47http://apidoc.cn/archives/47 JAVA向EXCEL写入海量数据
19 楼 juluren 2013-02-03  
http://apidoc.cn/archives/47
18 楼 run_xiao 2007-07-23  
我最后的解就是说服客户生成CSV,且每个CSV不超过6W行,hoho
17 楼 bonus 2007-07-13  
有新解嗎???
16 楼 icefire 2007-05-28  
哪个牛人带个头,弄一下吧!我想我不久也要碰上这样的事了!
15 楼 diandidemeng 2007-05-28  
看来这方面,还是要搞个成熟的方案,放在javaeye上共享才行哪,不然老是遇到此类问题,不行
14 楼 manus 2007-05-26  
不知道这个能不能帮助LZ
13 楼 manus 2007-05-26  
额,jdk1.4以上的版本,有个类专门是针对内存益出的, 好像叫什么 soft.... 具体忘了  可以在内存益出前处理..........
12 楼 kebo 2007-05-26  
Excel最多可以显示65536条数据吧。
11 楼 SunMicro 2007-05-26  
目前手头上的项目也需要导出数据,最大估计值有50w,jxl 1.8W就out,若分文件导出,客户肯定不会同意。

ray_linn能否多说几句关于如何让Excel自己去拉数据.
10 楼 java虫 2007-05-12  
run_xiao 写道
最近需要往Excel写入海量数据,大约10W笔左右(超过6万会新建一个sheet再写)

开始使用POI的包,写1W笔左右就out of memory了

后来换用jxl,写1.8w笔左右报out of memory
(我机器配置Pentium(R)D 3GHZ,双核,内存1G)

考虑到分批次写是否会好一些,每次先把数据写到一个临时文件,然后关闭流

再将临时文件读入后再往里写,可是发现这样还是不行

用jprofiler看了看内存使用状况,发现其实数据本身占空间并不是很大,而是每

一个cell会产生很多相关的对象(不管是POI还是jxl,jxl资源释放会快一些),

这些对象比数据本身占的空间要大得多,更郁闷的是即便是读入一个Excel文件,

也会为有值得cell自动产生这些对象

所以分批次写也行不通,因为中间产生的临时文件读入进来也可能耗光内存

现在能想到的解决方案:1.加内存,客户不乐意

2.替换成csv格式的文本,客户说这样产生文件数量太多也不乐意

不知各位还有什么高见?

谢谢





我用poi加载一个Excel大概快三M了,也出现过out of memory错误。

加大内存治标不治本,每个wb下面有多个sheet,每个sheet下有多个row,每个row下有多个cell等等对象太多,还是想其他方法为好。

而且每个sheet最多就25000多行吧
9 楼 ray_linn 2007-05-11  
SOAP toolkit,不要写Excel,让Excel自己去拉数据.
8 楼 ddandyy 2007-05-11  
SteveGY 写道
呵呵,又是这类问题,不用想了,你目前的情况基本上是没有选择的,直接用Excel保存2行数据的一个html格式的文档出来,把这个文件作jsp模板,然后把数据列循环替换掉,如果不是web应用的话,反正也是替换字符串,fetch next rowset and replace。你可以保存这个文件到后缀名.xls,这种方式产生出来的xls文件,可以被Excel识别,并且格式、颜色、字体什么的基本没有变化,客户没有感觉的。
如果是web应用,输出的时候可以设置一下Content-Type,不过我忘记具体的Excel MIME字符串是什么了,google一下,Content-Type是Excel的话,客户端可以直接调用Excel来加载显示的。


够狠
7 楼 dovecat 2007-05-11  
fins 写道
一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.

那时,我们公司一个技术牛人跟我说他用jxl成功的将30万条记录写入一个excel.
根本就是 吹牛.(当时是我们的领导让我们出一个导出数据的方案,他就是为了邀功吹牛.)
我随便问他几个相关的问题,他都说不清楚,来回搪塞我.
我让他给我看代码 给我看生成的30万条记录的excel文件都拿不 出来.找各种理由.最后反过来骂我,说我不相信他,怀疑他.还说我新来的算老几,他说我这种不相信别人的态度非常让他生气.
我当时差点吐血.





同情,碰到这样的,不要去惹...
6 楼 SteveGY 2007-05-10  
呵呵,又是这类问题,不用想了,你目前的情况基本上是没有选择的,直接用Excel保存2行数据的一个html格式的文档出来,把这个文件作jsp模板,然后把数据列循环替换掉,如果不是web应用的话,反正也是替换字符串,fetch next rowset and replace。你可以保存这个文件到后缀名.xls,这种方式产生出来的xls文件,可以被Excel识别,并且格式、颜色、字体什么的基本没有变化,客户没有感觉的。
如果是web应用,输出的时候可以设置一下Content-Type,不过我忘记具体的Excel MIME字符串是什么了,google一下,Content-Type是Excel的话,客户端可以直接调用Excel来加载显示的。
5 楼 fins 2007-05-10  
一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.

那时,我们公司一个技术牛人跟我说他用jxl成功的将30万条记录写入一个excel.
根本就是 吹牛.(当时是我们的领导让我们出一个导出数据的方案,他就是为了邀功吹牛.)
我随便问他几个相关的问题,他都说不清楚,来回搪塞我.
我让他给我看代码 给我看生成的30万条记录的excel文件都拿不 出来.找各种理由.最后反过来骂我,说我不相信他,怀疑他.还说我新来的算老几,他说我这种不相信别人的态度非常让他生气.
我当时差点吐血.



4 楼 daniel.wuz 2007-05-10  
我也在项目上遇到过这个问题,
一次可以导出2w左右的数据,再多就不行了,
因为项目上时间紧,后来的解决办法就是导成多个文件再合并..
3 楼 rtdb 2007-05-10  
先写成csv文件,
然后,应能用VBA依次读入EXCEL再输出成一个文件吧。
2 楼 抛出异常的爱 2007-05-10  
VBA的程序员比java的程序员水平提高的快
1 楼 苏飞 2007-05-10  
那分开为几个文件,大概客户也不乐意吧。

我想就很难有更好的办法,


以前我与一同事(主要是他写的)搞了一个象主流商业报表设计的一个东西,就是拿excel做模板,但是将读写excel单元格操作封装起来,将报表分成卡片式,列表式,主从式(分组),混和式,还有一个叫什么交叉式的,都是那同事搞的,我同他讨论了一下主从式报表分组统计及excel相对位置计算的问题,我觉的那哥们绝对称的上是一个编程高手。


我把这东西推荐给架构组,或许我推荐的方式有问题。非常的不屑一顾。在企业开发领域,做excel报表是极其普遍的一个东西。


而这个在读写excel文件级别上抽象到制作excel报表级别的业务实现组件,的确是一个非常好的东西。身为架构组的人员,对好的东西不予采纳,总在考虑自己的一些面子问题。

我笑。也只能如此,因为他们根本不在意他们架构的一些东西被下面的开发人员抱怨的。



唉,说来话长,不说也罢。


相关推荐

Global site tag (gtag.js) - Google Analytics