用POI制成EXCEL下载,数据量大时内存溢出,有什么样的解决办法?

AbsurdLife 2012-01-30 04:46:51
现在网上基本方法是:
1.使用CSV下载。
2.调大JVM ,Tomcat的内存。

目前这两种方法客户都不同意,大家还有什么方法吗?
...全文
2871 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
闭目鱼 2013-11-04
  • 打赏
  • 举报
回复
引用 55 楼 Larry_XiaoJun 的回复:
[quote=引用 54 楼 Larry_XiaoJun 的回复:] 今天也遇到这个问题了。。。 看完个位的回复很有心得,最后想到每写完一行数据就从list中移除这条数据。 这样就解决了内存不足的情况,大家可以试试~~
刚刚可以。。现在又出错了。。哎。。失败了。。[/quote] 53楼说的方法可以用
Larry_XiaoJun 2013-09-27
  • 打赏
  • 举报
回复
引用 54 楼 Larry_XiaoJun 的回复:
今天也遇到这个问题了。。。 看完个位的回复很有心得,最后想到每写完一行数据就从list中移除这条数据。 这样就解决了内存不足的情况,大家可以试试~~
刚刚可以。。现在又出错了。。哎。。失败了。。
Larry_XiaoJun 2013-09-27
  • 打赏
  • 举报
回复
今天也遇到这个问题了。。。 看完个位的回复很有心得,最后想到每写完一行数据就从list中移除这条数据。 这样就解决了内存不足的情况,大家可以试试~~
Rlay_2 2013-03-14
  • 打赏
  • 举报
回复
恩,我也遇到了,不过想了个笨方法,能向一个Excel文件的每个sheet页签写100W数据,普通电脑完全没有问题. 我用的是POI. 采用POI的SXSSFWorkbook对象,如: SXSSFWorkbook workbook = new SXSSFWorkbook(100); 这个100就是缓存行数,就这样往Excel写,写个100万不是问题,速度也很快. 如果是需要向一个现有的Excel文件再次写入数据,并且现有的Excel文件已经有很多数据了,如100万. 则直接向该文件写入还是会溢出,最好是每次都新写个Excel文件,然后再调用VB,执行2个Excel文件之间的sheet拷贝,这样是可以成功的
it档案馆 2013-03-01
  • 打赏
  • 举报
回复
tengyutong0213 2012-12-07
  • 打赏
  • 举报
回复
03的話,用eventusermodel模式 07的話,用流輸出模式
yangliang901009 2012-11-06
  • 打赏
  • 举报
回复
你们怎么能讨论到一半就不讨论了捏?怎么解决啊,亲,我也遇到这问题了。。。分文件可以,合并的时候还是爆掉了。。我用的JXL。
cjj110 2012-05-18
  • 打赏
  • 举报
回复
我也遇到过这样的问题,但是只是在本地机器上会出现内存溢出情况,
如果把应用程序部署到服务器上,由于服务器性能原因,基本上能够满
足客户需求,暂时没出现过内存溢出现象,所以我建议你去服务器上试试(
开大JVM内存也可以试试,悄悄的,不给他说,哈哈)。
如果实在不行,我就建议使用cvs下载了(客户不会不同意吧,这类后缀
名的文件,基本上默认就是用excel方式打开的,基本上不会有什么影响吧)
cjj110 2012-05-18
  • 打赏
  • 举报
回复
我也遇到过这样的问题,但是只是在本地机器上会出现内存溢出情况,
如果把应用程序部署到服务器上,由于服务器性能原因,基本上能够满
足客户需求,暂时没出现过内存溢出现象,所以我建议你去服务器上试试(
开大JVM内存也可以试试,悄悄的,不给他说,哈哈)。
如果实在不行,我就建议使用cvs下载了(客户不会不同意吧,这类后缀
名的文件,基本上默认就是用excel方式打开的,基本上不会有什么影响吧)
yuyangwxj 2012-03-15
  • 打赏
  • 举报
回复
不才啊,我现在也遇到这个问题了,将EXCEL中的10W左右记录导入数据库中,报错啊。
java.lang.OutOfMemoryError: Java heap space
大家一起研究研究,该如何解决呢?
楼主,现在解决了吗?
yupan6 2012-03-05
  • 打赏
  • 举报
回复
请问,这个问题你是怎么解决的、现在我也类似的问题、在28000多行时就会出现这样的问题!
softroad 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 absurdlife 的回复:]

引用 24 楼 lxwankkk 的回复:

引用 16 楼 absurdlife 的回复:

10W条的数据大概要20多S,就用poi。


数据库查出来直接放cell,还能容纳10W条而不出溢出错?太强了,给代码看看呗。
[/Quote]

这种方法我还真没试过,楼主试下发个结论出来。
不知道微软自己如何搞的,楼主找找有木有c语言导出excel的例子,如果有的话,可以封装成dll用jni调用试试。
AbsurdLife 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lxwankkk 的回复:]

引用 16 楼 absurdlife 的回复:

10W条的数据大概要20多S,就用poi。
[/Quote]

数据库查出来直接放cell,还能容纳10W条而不出溢出错?太强了,给代码看看呗。
AbsurdLife 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 ds590 的回复:]

我以前也遇到过这种问题,poi生成excel文档确实有数据量的问题,也是在28000行左右的数据,超过一定量的数据,必然会有这样的问题。
当时的解决办法是改成csv,别的没办法。
[/Quote]

28000 和我测试的上限差不多。
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 absurdlife 的回复:]

引用 15 楼 zhaoyangjay 的回复:

这问题 哥曾经遇到过,客户非要所有的数据都导出来,有时候数据量很大,甚至超过了EXCEL的最大行数,实在变态,后来的思路是:分割成多个小EXCEL文件,然后用Java的 ZIP类库的方法压缩成XXX.zip文件导出下载。


大哥,这么干客户是不会同意的。
他们需要这样的解决方案:
1.一个XLS文件下载。
2.若数据少于6万行……
[/Quote]
1.一个XLS文件下载。
2.若数据少于6万行,只做成一个Sheet。
3.大于6万行,以6万为单位分Sheet存放。
就是读到的数据不放入list,直接放到cell里呀,只是生成时间有点长罢了。
10W条的数据大概要20多S,就用poi。
Mountain_ 2012-02-01
  • 打赏
  • 举报
回复
我以前也遇到过这种问题,poi生成excel文档确实有数据量的问题,也是在28000行左右的数据,超过一定量的数据,必然会有这样的问题。
当时的解决办法是改成csv,别的没办法。
e9876 2012-02-01
  • 打赏
  • 举报
回复
CSV吧。。
不同意就让他们自己去搞。
clementxr 2012-02-01
  • 打赏
  • 举报
回复
刚好前段时间我也研究过这个问题,问过一些人,但无论是poi还是jxl,貌似都没有办法解决的
制成excel无论怎么操作最后都是统一优先load到内存最后写进去,这时候数据量大就会爆掉。
只有一种变相的解决办法就是满多少数据重新生成一个临时excel最后再合并,但我不知道怎么实现
AbsurdLife 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 softroad 的回复:]

或者楼主可以构造一个文件命名为xxx.xls,然后内容写

<table>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><……
[/Quote]

还有一个操作是读取进来,也是用POI。晕啊。

softroad 2012-02-01
  • 打赏
  • 举报
回复
或者楼主可以构造一个文件命名为xxx.xls,然后内容写

<table>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
</table>


不知道他们用这个excel数据还做后续操作不,如果只是看看,这样可以吧。
加载更多回复(36)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧