使用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内存溢出