论坛首页 Java企业应用论坛

Java往Excel写入海量数据

浏览 17798 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-10  
最近需要往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格式的文本,客户说这样产生文件数量太多也不乐意

不知各位还有什么高见?

谢谢


   发表时间:2007-05-10  
那分开为几个文件,大概客户也不乐意吧。

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


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


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


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

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



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


0 请登录后投票
   发表时间:2007-05-10  
VBA的程序员比java的程序员水平提高的快
0 请登录后投票
   发表时间:2007-05-10  
先写成csv文件,
然后,应能用VBA依次读入EXCEL再输出成一个文件吧。
0 请登录后投票
   发表时间:2007-05-10  
我也在项目上遇到过这个问题,
一次可以导出2w左右的数据,再多就不行了,
因为项目上时间紧,后来的解决办法就是导成多个文件再合并..
0 请登录后投票
   发表时间:2007-05-10  
一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.

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



0 请登录后投票
   发表时间: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来加载显示的。
0 请登录后投票
   发表时间:2007-05-11  
SOAP toolkit,不要写Excel,让Excel自己去拉数据.
0 请登录后投票
   发表时间: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多行吧
0 请登录后投票
   发表时间:2007-05-26  
目前手头上的项目也需要导出数据,最大估计值有50w,jxl 1.8W就out,若分文件导出,客户肯定不会同意。

ray_linn能否多说几句关于如何让Excel自己去拉数据.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics