`

[请教]jxl生成xls时,支持"合并"或"磁盘缓存"吗(导出大数据量时)

阅读更多
jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选.

但是由于长时间没有接触jxl了 对他的新版本不是很了解,
不知道能不能实现我下面的几个需求, 还请大家多帮个忙.

在生成excel时, jxl 的做法是在内存中构造出一个xls文件的对象
然后在最后write时生成最终的excel文件.
也就是说,在把excel所有的数据全部准备完毕(加入到那个xls的对象中) 之前,
这个超大对象一直是在jvm的内存中的, 这就导致大批量数据,如 100列10万行, 根本无法生成 OOM了.

我想问的就是,  jxl是否支持生成若干个小的xls文件, 然后合并的功能(基于磁盘的合并, 而不是全部读入内存 在合并,这种合并还是要占用大量甚至更多的内存的,对于解决我的问题毫无帮助)

或者是 能不能让它在最终生成excel文件之前, 就把一部分内容写入磁盘的临时文件中,从而保证对内存的占用量一直维持在比较低的水平?

如果都不支持, 那么我想问一下 ,大家是怎么导出超大数据量的excel的?


P.S.: 哪位英语好 能不能帮我把我的问题反馈给 jxl的作者呢?
我觉得从技术角度来讲 我的那两个需求应该是完全能都实现的.


分享到:
评论
25 楼 Wisdom7 2008-08-12  
如果用POI的话,直接用流读取生成的EXCEL后转成WORKBOOK,就可以合并了
24 楼 fins 2008-08-12  
如何把这些文件合并成一个文件呢?
因为客户的需求 是希望在一个文件里 便于打印
23 楼 seemoon 2008-08-12  
可以分批生成xls文件,如有100w数据,生成20个xls文件,每个文件5w条记录,并且对每个文件的文件名作number索引,然后zip并且下载。
22 楼 ciyuanlong 2008-08-06  
虽然有行数限制(65535),但是那是一个sheet的数量,我曾经写过14w多,分sheet,是在hp530服务器上,jvm开的很大,但是超过这个数量就不行了,内存不够了
21 楼 Wisdom7 2008-08-05  
我用JXLS,只做过生成过几百个SHEET,每SHEET有500个CELL左右,没对JVM调过优。
因为要生成封面和封底,当时的做法是先用模板生成多个WORKBOOK后再合并的,不过JXLS又是基于POI而已
20 楼 fins 2008-08-03  
excel2007没有这个限制

而且 excel的老版本的限制也只是  每个sheet页最多255列 65525行
一个excel是可以有多个sheet页的
19 楼 xxboy 2008-08-03  
好像excel最多也就是支持6w行数据吧
18 楼 hetylei 2008-08-02  
呵呵 发现论坛小BUG
点击回复表情图标

生成插入的代码都是 
 : ? : 


前面某楼回复的变成了
正好小刺激某人一下
17 楼 cats_tiger 2008-08-02  
llade 写道
nihongye 写道
看了poi的源码,读取excel,有一个基于事件流的机制,能保持很小的内存占用,参照XLS2CSVmra这个例子。
写入上,sheet的序列化过程简单的调用各个Record的序列化方法。那么直接创建record,不经过sheet,然后直接调用record的序列化方法,便能控制在很小的内存占用:)


nihongye说的目前可能是POI处理大数据量excel的正道,类似SAX处理XML的方式。不使用LOW LEVEL 和EVENT API的话则类似DOM处理XML的方式。
http://poi.apache.org/hssf/how-to.html#event_api

下一步POI的主要日程:

引用
What's Next?
Further effort on HSSF is going to focus on the following major areas:

Performance: POI currently uses a lot of memory for large sheets.
Charts: This is a hard problem, with very little documentation.

哇,POI出新版本了,看来的确是正道。
16 楼 llade 2008-08-02  
nihongye 写道
看了poi的源码,读取excel,有一个基于事件流的机制,能保持很小的内存占用,参照XLS2CSVmra这个例子。
写入上,sheet的序列化过程简单的调用各个Record的序列化方法。那么直接创建record,不经过sheet,然后直接调用record的序列化方法,便能控制在很小的内存占用:)


nihongye说的目前可能是POI处理大数据量excel的正道,类似SAX处理XML的方式。不使用LOW LEVEL 和EVENT API的话则类似DOM处理XML的方式。
http://poi.apache.org/hssf/how-to.html#event_api

下一步POI的主要日程:

引用
What's Next?
Further effort on HSSF is going to focus on the following major areas:

Performance: POI currently uses a lot of memory for large sheets.
Charts: This is a hard problem, with very little documentation.
15 楼 cats_tiger 2008-08-02  
hetylei 写道
呵呵

引用
这个超大对象一直是在jvm的内存中的, 这就导致大批量数据,如 100列10万行


我只是提示了一下excel有行限制的问题,因为做一个这样的应用,不光要考虑实现的问题,还要考虑到外部环境。excel有行限制 jxl就是再做缓存再高效生成的excel文件用excel打不开那也是白搭(另外 你还不考虑客户excel版本兼容性问题,难道用你的产品要强制装某一个版本的excel?jxl可没这样干)


PS:如果不考虑导入的格式/行列限制,可以直接导出到像csv等excel支持的文本格式,改个文件名就行。

你好像确实没有弄明白LZ的问题,excel就算有行数限制,装个百八十万行数据应该没有问题,香港有个上市公司用Excel做ERP呢。用jxl我试过20多列数据,Xmx开到1g,不到20w行就溢出了,而且是一个线程,POI十万行就over了。
LZ的问题,用JDBC-ODBC bridge应该也是可以的,只是比较土。
14 楼 cats_tiger 2008-08-02  
同样的问题我也遇到过,POI和JXL都有溢出,JXL还好些。我觉得除非自己研究Excel的格式(MS有公布),或者用JINI调用OLE(不能跨平台了),否则只有增大JVM内存了。
实际的项目中,我们引导客户,让他们缩小范围(比如先查询再导出)。十几万行数据导出是没有意义的。
哦,还有一个办法,就是导出txt格式,用TAB分开,这样也可以用Excel打开。
另外,如果ExtremeTable或ECSide结合Hibernate做导出,还没等jxl溢出,Hibernate就完了,因为MaxResults设置的太大了。可以修改XslView,用hibernate的scroll方式导出,这样也能增大溢出的上限,但是不能从根本上解决问题。
13 楼 hetylei 2008-08-02  
呵呵

引用
这个超大对象一直是在jvm的内存中的, 这就导致大批量数据,如 100列10万行


我只是提示了一下excel有行限制的问题,因为做一个这样的应用,不光要考虑实现的问题,还要考虑到外部环境。excel有行限制 jxl就是再做缓存再高效生成的excel文件用excel打不开那也是白搭(另外 你还不考虑客户excel版本兼容性问题,难道用你的产品要强制装某一个版本的excel?jxl可没这样干)


PS:如果不考虑导入的格式/行列限制,可以直接导出到像csv等excel支持的文本格式,改个文件名就行。
12 楼 fins 2008-08-01  
我以前的客户要求
每个sheet 1万条 多个sheet
11 楼 peream 2008-08-01  
以前也碰到类似问题,几十万级别的,后来说服客户将记录导成多个文件再打成个zip包提供下载。关注一下大家的解决办法
10 楼 fins 2008-08-01  
很幸运 2007限制的行号已经能够使导出操作产生大量的oom了

hetylei

你看问题的视角太窄了 让我想起了高中时的我 总是抓住一个字眼不放,
让对问题的讨论变成了"抬杠"或者是"转牛角尖"



这篇文章的核心思想是:

如何避免导出"含有大量数据的excel文件时" 系统发生内存溢出

而不是在讨论 excel导出行数的问题

即使我只导出1000行,列数很多 每个单元格的数据量很大,而且机器的内存小,
那么也很容易产生 OOM的问题.

9 楼 hetylei 2008-08-01  
很不幸 excel2007 依然有行数限制

8 楼 nihongye 2008-07-31  
看了poi的源码,读取excel,有一个基于事件流的机制,能保持很小的内存占用,参照XLS2CSVmra这个例子。
写入上,sheet的序列化过程简单的调用各个Record的序列化方法。那么直接创建record,不经过sheet,然后直接调用record的序列化方法,便能控制在很小的内存占用:)
7 楼 fins 2008-07-31  
你是来告诉我 世界上没有excel 2007的吗

谢谢了


6 楼 hetylei 2008-07-31  



baidu 到一个
http://zhidao.baidu.com/question/8374118.html?fr=qrl


这些计算机X级考试的问题,怎么会没被我们考虑到。。。

相关推荐

Global site tag (gtag.js) - Google Analytics