使用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();
}
}jxlexcel内存溢出
部分代码如下,请各位大虾帮帮忙,感激不尽(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();
}
}jxlexcel内存溢出
解决方案 »
- 我用本地sql查询怎么不行啊?老报错
- myeclipse部署后 tomcat的webapps下没出现项目?项目没有自动拷贝过来
- EXT 树 的问题,求救
- 查找用户(user)是否有访问url的权限问题?
- 请问在那里可以下到J2EE API文档啊!能给个连接吗?谢谢~
- 什么是反射机制!
- JBUILD中 Fatal Error: Unable to locate package java.lang in classpath or bootclasspath是怎么回事啊
- 请高手证实:JTA事务模式下似乎只能通过连接池获取连接,否则事务无法保证
- 字符串拷贝到字符串数组的问题,棘手,请教!
- 我的Tomcat4出了问题,帮我看看,
- 回答就有分!springmvc的例子在调用action时spring注入成功,但是在访问时注入的东西是null
- 史上最易学的java教程共享下
我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
请问怎么把缓冲区的数据输出?我把book也关闭了,还是不行。