使用jxl 导出 excel 大文件 内存溢出,有没有解决的办法?
使用jxl 导出 excel 大文件 内存溢出,有没有解决的办法?部分代码如下,请各位大虾帮帮忙,感激不尽。。。(workbook.write()这里
出现了bug。)
// 表头
public String[] TABLEHEADER = null;
// 表头的单元格个数目
public int CELL_NUMBER = 0 ;
//表中的行数
private static final int SHEET_ROW_COUNT = 20000;
OutputStream outStream = null;
private int flag_3 = 0;//excel行数
public void exportExcel(DaoManager daoManager, OutputStream outStream, String sql, String sql1, String tableName,
String[] tableHeader){
this.outStream = outStream;
try {
this.TABLEHEADER = tableHeader ;
CELL_NUMBER = TABLEHEADER.length;
WritableWorkbook workbook=Workbook.createWorkbook(outStream);//创建工作薄
int flag = daoManager.getRecCount(sql1, null);//导出总条数
int flag_1 = 0;//总条数除以20000
int flag_2 = 0;//总条数除以10000
int num1 = 1,num2 = 1;//每次取值标志
String sql_qz ="";
ArrayList al = null;
if(flag==0){
flag_1 = 1;
flag_2 = 1;
}else{
if(flag%SHEET_ROW_COUNT==0){
flag_1 = flag/SHEET_ROW_COUNT;
}else{
flag_1 = flag/SHEET_ROW_COUNT+1;
}
//System.out.println("flag_1="+flag_1);
if(flag%10000==0){
flag_2 = flag/10000;
}else{
flag_2 = flag/10000+1;
}
//System.out.println("flag_2="+flag_2);
}
WritableSheet [] worksheet_group = new WritableSheet[flag_1];
for(int i = 0; i<flag_1 ;i++)
{
worksheet_group[i] = workbook.createSheet(tableName+i+1,0);//创建工作表,tableName+i工作表名称
createHeader(worksheet_group[i]);
if((i+1)*2>=flag_2){
for(int j = i*2;j<flag_2;j++){
num1 = num1+j*10000;
num2 = (j+num2)*10000;
if(j==flag_2-1){
num2 = j*10000+flag%10000;
}
sql_qz = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM ("+sql + ") A ) where (RN between '"+num1+"' and '"+num2+"')";
//System.out.println("sql=="+sql_qz);
al = getContent(daoManager, sql_qz);
createRows(worksheet_group[i], al);
num1 = 1;
num2 = 1;
al.clear();
}
}else{
for(int j = i*2;j<(i+1)*2;j++){
num1 = num1+j*10000;
num2 = (j+num2)*10000;
sql_qz = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM ("+sql+") A ) where (RN between "+num1+" and "+num2+")";
al = getContent(daoManager, sql_qz);
createRows(worksheet_group[i], al);
num1 = 1;
num2 = 1;
al.clear();
}
}
}
workbook.write();
workbook.close();
outStream.flush();
outStream.close();
//System.out.println("-----------------");
} catch (Exception e) {
System.out.println("\n--------"+e+"----------\n");
e.printStackTrace();
}
} jxl excel 内存溢出 --------------------编程问答-------------------- 把堆内存设大点。 --------------------编程问答-------------------- 不增大内存,还有别的办法吗? --------------------编程问答-------------------- 先看看有多少条记录。 --------------------编程问答-------------------- 要是记录比较多的话建议分割一下 分成多个小的文件 用循环来控制写多文件 这样避免一次将大量数据读到内存中 楼主可以尝试一下 --------------------编程问答-------------------- POI的方式试一试。
我POI读1W条数据的,10M左右的execl没有问题。 --------------------编程问答--------------------
刚才特意测试了一条超大数据量的,也出了问题。
报错:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
解决办法
http://www.blogjava.net/liuwentao253/archive/2008/06/03/205466.html --------------------编程问答-------------------- 数据太大,在workbook达到一定大小或者一定行数的时候,就要把缓冲区的数据输出。 --------------------编程问答--------------------
我用循环了,还是不行,你说的分割成小文件能具体点吗? --------------------编程问答--------------------
请问怎么把缓冲区的数据输出?我把book也关闭了,还是不行。
补充:Java , Java EE