poi生成excel文件时报OutOfMemory异常!

winner1913 2011-06-03 03:02:10
项目S2SH架构,从库表中查出的记录有一万多条, JVM的值也调到足够大了,还是有这样的问题!

有其他的好方法么?
...全文
629 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
AbsurdLife 2012-01-31
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 magicboylinw 的回复:]

分页查询,然后生成的excel保存在文件系统里而不放在内存里,每次查询后插入到文件系统的excel表里,删除内存中的结果集和excel,这样就不用很大内存了。
不过我不知道poi操纵excel时,会不会把整个excel文件放入内存中去,你也可以到官网看看有什么优化方法。
[/Quote]

先读再写,文件原来越大,后来还是内存溢出。
lg_asus 2012-01-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 soli11722984 的回复:]
用JXL生成一個已經有第一列和多個分頁的EXCEL
然後直接通過ODBC橋接,用JDBC寫操作,當寫了6W多行,就寫下一頁(其實是換了句SQL),不過要注意關閉CONNECTION,我是2W條關一次,不然會出奇怪的錯誤
[/Quote]
用jdbc写啥意思? 不是还要打开excel文件吗?

楼主可以试试jxl,或者直接用cvs格式
小威 2012-01-30
  • 打赏
  • 举报
回复
分页查询,然后生成的excel保存在文件系统里而不放在内存里,每次查询后插入到文件系统的excel表里,删除内存中的结果集和excel,这样就不用很大内存了。
不过我不知道poi操纵excel时,会不会把整个excel文件放入内存中去,你也可以到官网看看有什么优化方法。
AbsurdLife 2012-01-30
  • 打赏
  • 举报
回复
一样的问题。
ccyandmf 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 woshinihaiyan 的回复:]
我导出的是10w多条数据 没什么问题 我是直接调用的存储过程 分批写入 1000一次
[/Quote]

能给我说说怎么把 查询出来的多个list 写入同一个文件吗?
我也是分批查询,但是每次写入一个list 就不写了!很郁闷
我的qq 435075657
lg_asus 2011-06-09
  • 打赏
  • 举报
回复
POI占用资源比JXL大,如果只是简单汇出的话建议用jxl
soli11722984 2011-06-09
  • 打赏
  • 举报
回复
用JXL生成一個已經有第一列和多個分頁的EXCEL
然後直接通過ODBC橋接,用JDBC寫操作,當寫了6W多行,就寫下一頁(其實是換了句SQL),不過要注意關閉CONNECTION,我是2W條關一次,不然會出奇怪的錯誤
woshinihaiyan 2011-06-08
  • 打赏
  • 举报
回复
我导出的是10w多条数据 没什么问题 我是直接调用的存储过程 分批写入 1000一次
winner1913 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 soli11722984 的回复:]
JDBC。。。。50多W的數據也能出來
不過文件。。。。。100M,我靠
[/Quote]

可以分享一下你的思路,方法嘛?
风中叶 2011-06-08
  • 打赏
  • 举报
回复
数据的导出 目前还没有碰到太大的 不过这个问题值得收藏 以备将来遇到
soli11722984 2011-06-08
  • 打赏
  • 举报
回复
JDBC。。。。50多W的數據也能出來
不過文件。。。。。100M,我靠
winner1913 2011-06-08
  • 打赏
  • 举报
回复
4楼说得有道理,但客户要求导出1W多数据 ,这个我是没办法变更的,呵呵!
现在正在尝试9楼提到的方法!
先谢了,各位!
Spring89 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 supperman_009 的回复:]
程序运行时,启动脚本 java后面加JVM参数。
-Xmx512M 或者更大。就ok了
[/Quote]
这样的问题,我也有遇到,我也是这样调的!
这样子问题是解决了,但是你查看进程,会发现你进程占了100%
想想,这样子的解决方法肯定是不行了!太占内存了,
你不可能一个时间只执行这一个操作!
这在你本地速度都有点慢,然后在服务器上面呢?
想过没有?将会造成怎样的后果......
有多个人同时访问时,而只有一个人导出,你的服务器就要挂了!
loveunittesting 2011-06-03
  • 打赏
  • 举报
回复
每个sheet最大行数为65535,多了要新开一个sheet,最多255个sheet
loveunittesting 2011-06-03
  • 打赏
  • 举报
回复
我的csdn博客上有解决方法,我的处理方式有2种
1.用windows的olddb驱动往excel里插入数据,必须生成文件在磁盘,并且必须在windows服务器系统
2.用excel的xml形式,查询到数据直接追加到文件,别放到list里,直接用resultset.next查询到就写入文件,避免占用过大内存。
zhouyusunquan 2011-06-03
  • 打赏
  • 举报
回复
package com.daoyuan.common.tool;
import java.io.*;

import jxl.*;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import java.util.*;
/**
* 2011-4-27
* Caozuo.java
* author:zhouquan
* tel:15058149753
* email:zhouquan516@gmail.com
*/
public class Caozuo {
InputStream is = null; //定义一个输入流
jxl.Workbook rwb = null;//定义一个只读的工作薄
WritableWorkbook wr=null; //定义一个可写的工作薄
FileOutputStream out=null;
WritableSheet sheet=null;
String worksheet = "List";//输出的excel文件工作表名
public Caozuo() {
try {
out=new FileOutputStream("E:\\a.xls");
wr=Workbook.createWorkbook(out);
sheet = wr.createSheet(worksheet, 0);
// WritableWorkbook wr = Workbook.createWorkbook(new File("E:\\a.xls"));
// //out=new FileOutputStream("E:\\a.xls");
// is = new FileInputStream("E:\\a.xls");//创建一个输入流
// rwb = Workbook.getWorkbook(is);//创建只读工作薄
// //wr=Workbook.createWorkbook(out);
// wr=Workbook.createWorkbook(new File("E:\\a.xls"), rwb);//创建可写的工作薄

} catch (Exception e) {
e.printStackTrace();
}
}

public ArrayList Select() {
ArrayList arr = new ArrayList();
Sheet rs = rwb.getSheet(0);//读取第一个表
for (int i = 0; i < rs.getRows(); i++) {
ArrayList arr1 = new ArrayList();
for (int k = 0; k < rs.getColumns(); k++) {
Cell c00 = rs.getCell(k, i);//k表示列,i表示行,注列和行从0开始

String strc00 = c00.getContents();//getContents()方法是将Cell转换为字符串形式
arr1.add(strc00);
}
arr.add(arr1);
}
rwb.close();
return arr;
}

public void Insert() throws RowsExceededException, WriteException, IOException {
WritableSheet rs = wr.getSheet(0);//查找表一
//WritableSheet rs = (WritableSheet)rwb.getSheet(0);

int rownumber = rs.getRows();//多少行
int cellnumber = rs.getColumns();//多少列
for (int k = 0; k < cellnumber; k++) {
jxl.write.Label labelC = new jxl.write.Label(k,rownumber,"这是第'"+rownumber+"'行,第'"+k+"'列");
labelC.setString("fdsadf");
//k表示哪一列,rownumber表示哪一行,从而定向到某个单元格,第三个参数是单元格内的内容
rs.addCell(labelC);//把此单元格放入表中
}

wr.write();//写入
wr.close();
}
public String GoujianTable(String s ) throws Exception{
int rownumber=s.split(";").length;
int cellnumber=s.split(";")[0].split(",").length;
String [] slist=s.split(";");
String talbeString="<table >";
for(int i=0; i<rownumber;i++){
String [] sllist=slist[i].split(",");
talbeString=talbeString+"<tr>";
for(int k=0;k<cellnumber-1;k++){
talbeString=talbeString+"<td>";
talbeString=talbeString+sllist[k];
talbeString=talbeString+"</td>";

}
talbeString=talbeString+"</tr>";
}
talbeString=talbeString+"</table>";
return talbeString;
}
public void Inserted(String s ) throws Exception{
int rownumber=s.split(";").length;
int cellnumber=s.split(";")[0].split(",").length;
WritableSheet rs = wr.getSheet(0);//查找表一
String [] slist=s.split(";");
for(int i=0; i<rownumber;i++){
String [] sllist=slist[i].split(",");
for(int k=0;k<cellnumber;k++){
jxl.write.Label labelC = new jxl.write.Label(k,i,sllist[k]);
rs.addCell(labelC);
System.out.println("22");
}

}
wr.write();//写入
System.out.println("**********************");
wr.close();
}
public void Delete(int id) throws IOException, WriteException{//id表示行号
WritableSheet rs=wr.getSheet(0);//查找表一
rs.removeRow(id-1);//删除行
wr.write();//从内存中写入
wr.close();

}
public void Update(int rowid,int columid,String cansu) throws RowsExceededException, WriteException, IOException{
WritableSheet rs=wr.getSheet(0);
//因为行和列都是从0开始,所以要减一
jxl.write.Label labelC = new jxl.write.Label(columid-1,rowid-1,cansu);
//WritableCell cell=(WritableCell) rs.getCell(columid-1,rowid-1);
rs.addCell(labelC);
wr.write();//写入
wr.close();
}
}

夜魔009 2011-06-03
  • 打赏
  • 举报
回复
程序运行时,启动脚本 java后面加JVM参数。
-Xmx512M 或者更大。就ok了
breezewj 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liutianxiong888 的回复:]
一万多条记录,程序不挂掉才怪!调了内存能有什么用呢?反而增加服务器的压力。
没必要导出那么多吧,一万多条记录导出后给别人看的效果是什么样?可想而知...
查询的数据放在list中,你在当中放了1W多条,哦,不可想像!你很历害!
建议换方法,不要导出那么多......
[/Quote]
同意 !
wang12 2011-06-03
  • 打赏
  • 举报
回复
我认为这个异常有两方面的原因
首先,你将1W多条数据装入List中,本身就是一个很吃内存的操作
其次,又将1W条数据写入Excel更是雪上加霜
Spring89 2011-06-03
  • 打赏
  • 举报
回复
一万多条记录,程序不挂掉才怪!调了内存能有什么用呢?反而增加服务器的压力。
没必要导出那么多吧,一万多条记录导出后给别人看的效果是什么样?可想而知...
查询的数据放在list中,你在当中放了1W多条,哦,不可想像!你很历害!
建议换方法,不要导出那么多......
加载更多回复(3)

81,092

社区成员

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

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