精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-01
很幸运 2007限制的行号已经能够使导出操作产生大量的oom了
hetylei 你看问题的视角太窄了 让我想起了高中时的我 总是抓住一个字眼不放, 让对问题的讨论变成了"抬杠"或者是"转牛角尖" 这篇文章的核心思想是: 如何避免导出"含有大量数据的excel文件时" 系统发生内存溢出 而不是在讨论 excel导出行数的问题 即使我只导出1000行,列数很多 每个单元格的数据量很大,而且机器的内存小, 那么也很容易产生 OOM的问题. |
|
返回顶楼 | |
发表时间:2008-08-01
以前也碰到类似问题,几十万级别的,后来说服客户将记录导成多个文件再打成个zip包提供下载。关注一下大家的解决办法
|
|
返回顶楼 | |
发表时间:2008-08-01
我以前的客户要求
每个sheet 1万条 多个sheet |
|
返回顶楼 | |
发表时间:2008-08-02
呵呵
引用 这个超大对象一直是在jvm的内存中的, 这就导致大批量数据,如 100列10万行
我只是提示了一下excel有行限制的问题,因为做一个这样的应用,不光要考虑实现的问题,还要考虑到外部环境。excel有行限制 jxl就是再做缓存再高效生成的excel文件用excel打不开那也是白搭(另外 你还不考虑客户excel版本兼容性问题,难道用你的产品要强制装某一个版本的excel?jxl可没这样干) PS:如果不考虑导入的格式/行列限制,可以直接导出到像csv等excel支持的文本格式,改个文件名就行。 |
|
返回顶楼 | |
发表时间:2008-08-02
同样的问题我也遇到过,POI和JXL都有溢出,JXL还好些。我觉得除非自己研究Excel的格式(MS有公布),或者用JINI调用OLE(不能跨平台了),否则只有增大JVM内存了。
实际的项目中,我们引导客户,让他们缩小范围(比如先查询再导出)。十几万行数据导出是没有意义的。 哦,还有一个办法,就是导出txt格式,用TAB分开,这样也可以用Excel打开。 另外,如果ExtremeTable或ECSide结合Hibernate做导出,还没等jxl溢出,Hibernate就完了,因为MaxResults设置的太大了。可以修改XslView,用hibernate的scroll方式导出,这样也能增大溢出的上限,但是不能从根本上解决问题。 |
|
返回顶楼 | |
发表时间: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应该也是可以的,只是比较土。 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间: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出新版本了,看来的确是正道。 |
|
返回顶楼 | |
发表时间:2008-08-02
呵呵 发现论坛小BUG
点击回复表情图标 和 生成插入的代码都是 : ? : 前面某楼回复的变成了 正好小刺激某人一下 |
|
返回顶楼 | |
发表时间:2008-08-03
好像excel最多也就是支持6w行数据吧
|
|
返回顶楼 | |