Java往Excel写入海量数据
最近需要往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格式的文本,客户说这样产生文件数量太多也不乐意
不知各位还有什么高见?
谢谢
1 楼 苏飞 2007-05-10 那分开为几个文件,大概客户也不乐意吧。
我想就很难有更好的办法,
以前我与一同事(主要是他写的)搞了一个象主流商业报表设计的一个东西,就是拿excel做模板,但是将读写excel单元格操作封装起来,将报表分成卡片式,列表式,主从式(分组),混和式,还有一个叫什么交叉式的,都是那同事搞的,我同他讨论了一下主从式报表分组统计及excel相对位置计算的问题,我觉的那哥们绝对称的上是一个编程高手。
我把这东西推荐给架构组,或许我推荐的方式有问题。非常的不屑一顾。在企业开发领域,做excel报表是极其普遍的一个东西。
而这个在读写excel文件级别上抽象到制作excel报表级别的业务实现组件,的确是一个非常好的东西。身为架构组的人员,对好的东西不予采纳,总在考虑自己的一些面子问题。
我笑。也只能如此,因为他们根本不在意他们架构的一些东西被下面的开发人员抱怨的。
唉,说来话长,不说也罢。
2 楼 抛出异常的爱 2007-05-10 VBA的程序员比java的程序员水平提高的快 3 楼 rtdb 2007-05-10 先写成csv文件,
然后,应能用VBA依次读入EXCEL再输出成一个文件吧。 4 楼 daniel.wuz 2007-05-10 我也在项目上遇到过这个问题,
一次可以导出2w左右的数据,再多就不行了,
因为项目上时间紧,后来的解决办法就是导成多个文件再合并..
5 楼 fins 2007-05-10 一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.
那时,我们公司一个技术牛人跟我说他用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来加载显示的。 7 楼 dovecat 2007-05-11 fins 写道一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.
那时,我们公司一个技术牛人跟我说他用jxl成功的将30万条记录写入一个excel.
根本就是 吹牛.(当时是我们的领导让我们出一个导出数据的方案,他就是为了邀功吹牛.)
我随便问他几个相关的问题,他都说不清楚,来回搪塞我.
我让他给我看代码 给我看生成的30万条记录的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来加载显示的。
够狠 9 楼 ray_linn 2007-05-11 SOAP toolkit,不要写Excel,让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多行吧 11 楼 SunMicro 2007-05-26 目前手头上的项目也需要导出数据,最大估计值有50w,jxl 1.8W就out,若分文件导出,客户肯定不会同意。
ray_linn能否多说几句关于如何让Excel自己去拉数据. 12 楼 kebo 2007-05-26 Excel最多可以显示65536条数据吧。 13 楼 manus 2007-05-26 额,jdk1.4以上的版本,有个类专门是针对内存益出的, 好像叫什么 soft.... 具体忘了 可以在内存益出前处理.......... 14 楼 manus 2007-05-26 不知道这个能不能帮助LZ 15 楼 diandidemeng 2007-05-28 看来这方面,还是要搞个成熟的方案,放在javaeye上共享才行哪,不然老是遇到此类问题,不行 16 楼 icefire 2007-05-28 哪个牛人带个头,弄一下吧!我想我不久也要碰上这样的事了! 17 楼 bonus 2007-07-13 有新解嗎??? 18 楼 run_xiao 2007-07-23 我最后的解就是说服客户生成CSV,且每个CSV不超过6W行,hoho