当前位置:编程学习 > JAVA >>

使用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没有问题。 --------------------编程问答--------------------
引用 5 楼 AA5279AA 的回复:
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达到一定大小或者一定行数的时候,就要把缓冲区的数据输出。 --------------------编程问答--------------------
引用 4 楼 a597926661 的回复:
要是记录比较多的话建议分割一下 分成多个小的文件 用循环来控制写多文件 这样避免一次将大量数据读到内存中 楼主可以尝试一下


我用循环了,还是不行,你说的分割成小文件能具体点吗? --------------------编程问答--------------------
引用 7 楼 vitoinch 的回复:
数据太大,在workbook达到一定大小或者一定行数的时候,就要把缓冲区的数据输出。


请问怎么把缓冲区的数据输出?我把book也关闭了,还是不行。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,