用HSSF生成一个excel表,然后往里面加数据。大约写到4万多条的时候会出错,提示“Exception in thread "main" java.lang.OutOfMemoryError: Java heap space”哪位高手知道解决方案?我已经把JVM的memory pool最大值改成我自己的内存大小了~
代码大致如下:
package ExcelOut;import java.io.FileOutputStream;
import java.io.File; 
import java.awt.*;
import javax.swing.*;import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;public class ExcelOut extends Frame{

    public static void main(String[] args) {
        try{
            makeExcelfile("C:\\test.xls");
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("fault!");
        }
    }    private static void makeExcelfile(String filename) throws Exception{        HSSFWorkbook wb = new HSSFWorkbook();
        FileOutputStream fileOut = new FileOutputStream(filename);        createListSheet(wb);        wb.write(fileOut);
        fileOut.close();
        System.out.println("completed");
    }    private static void createListSheet(HSSFWorkbook wb) throws Exception{
        HSSFSheet sheet = wb.createSheet();
        wb.setSheetName(1,"List",HSSFWorkbook.ENCODING_UTF_16);
        
     HSSFRow row = sheet.createRow(0);
    
     setCell(row,0,"No.");
     setCell(row,1,"a");
     setCell(row,2,"keyword");
     setCell(row,3,"name");
     setCell(row,4,"type");
     setCell(row,5,"counter");
     setCell(row,6,"length");
     setCell(row,7,"note");
        
        for(int i=1;i<=60000;i++){
         String a[] = new String[8];
         a[0] = ""+i;
         a[1] = "hinryaku"+i;
         a[2] = "keyword"+i;
         a[3] = "hinmei"+i;
         a[4] = "katamei"+i;
         a[5] = "number"+i;
         a[6] = "length"+i;
         a[7] = "note"+i;
         setListSheetLine(sheet,i,a);
        }
    }
  
    private static void setListSheetLine(HSSFSheet st,int rowNo,String[] arg) throws Exception{
     HSSFRow row = st.createRow(rowNo);
     for(int i=0;i<8;i++)
     setCell(row,i,arg[i]);
    }
    
    private static void setCell(HSSFRow row,int columnNo,String arg){
     HSSFCell cell = row.createCell((short)columnNo);
     cell.setEncoding(HSSFCell.ENCODING_UTF_16);
        cell.setCellValue(arg);
    }
}

解决方案 »

  1.   

    package Practice;import java.io.FileOutputStream;
    import java.io.File; 
    import java.awt.*;
    import javax.swing.*;import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFCell;public class ExcelOut extends Frame{    public static void main(String[] args) {
            try{
                makeExcelfile("G:\\test.xls");
            }catch(Exception e){
                e.printStackTrace();
                System.out.println("fault!");
            }
        }    private static void makeExcelfile(String filename) throws Exception{        HSSFWorkbook wb = new HSSFWorkbook();
            FileOutputStream fileOut = new FileOutputStream(filename);        createListSheet(wb);        wb.write(fileOut);
            fileOut.close();
            System.out.println("completed");
        }    private static void createListSheet(HSSFWorkbook wb) throws Exception{
            HSSFSheet sheet = wb.createSheet();
            wb.setSheetName(0,"List",HSSFWorkbook.ENCODING_UTF_16);//第一個sheet 以0開始計數,當然樓主可以再創建一個sheet
            HSSFRow row = sheet.createRow(sheet.getFirstRowNum());//這裡跟樓主用的0的作用是一樣的        setCell(row,0,"No.");
            setCell(row,1,"a");
            setCell(row,2,"keyword");
            setCell(row,3,"name");
            setCell(row,4,"type");
            setCell(row,5,"counter");
            setCell(row,6,"length");
            setCell(row,7,"note");        for(int i=1;i<60;i++){//關鍵問題是這裡,一個sheet 無法承載60000筆數據,所以出現outOfMemoryError
                    String a[] = new String[8];
                    a[0] = ""+i;
                    a[1] = "hinryaku"+i;
                    a[2] = "keyword"+i;
                    a[3] = "hinmei"+i;
                    a[4] = "katamei"+i;
                    a[5] = "number"+i;
                    a[6] = "length"+i;
                    a[7] = "note"+i;
                    setListSheetLine(sheet,i,a);
            }
        }    private static void setListSheetLine(HSSFSheet st,int rowNo,String[] arg) throws Exception{
            HSSFRow row = st.createRow(rowNo);
            for(int i=0;i<8;i++)
                    setCell(row,i,arg[i]);
        }    private static void setCell(HSSFRow row,int columnNo,String arg){
            HSSFCell cell = row.createCell((short)columnNo);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellValue(arg);
        }
    }
      

  2.   

    to 樓主:
    內存溢出,不是我剛才所說的,而是因為java的堆棧空間不夠大,所以導致內存溢出
      

  3.   

    to楼上的:照你的意思,因为java的堆栈空间有限,所以这个问题是无法解决的?(我已经把堆栈空间设为我机器允许的最大值了)
      

  4.   

    分批倒,不要一次就倒总数那么多报表最多容纳65536行记录,10000以上会非常慢,有可能会out of memory
      

  5.   

    分批倒,不要一次就倒总数那么多
    -----------------------------------能说得清楚一点么?我这里的要求是,从某个数据库中查询得到数据,写到excel表里去~~可能会有数万条,怎么样分批倒呢?
      

  6.   

    用POI做过报表,但数据量不如楼主多,还没有出现过这种情况
      

  7.   

    就觉得楼主没必要每个循环都创建一个数组,我觉得问题就出在这里,把String a[] = new String[8];放在循环外面试一下!
      

  8.   

    to alexwan(牧林) ( ) :这个不是产生问题的原因,是在向workbook对象里write(fileOut);时发生outofmemory错误的。顺便说,在循环体里new string数组的话应该不会造成使用内存的增加,因为每次都会被析构的,内存会释放出来。当然,这样的确会影响速度……
      

  9.   

    那位高手知道如何获得,EXCL表单元格的"批注"内容?用HSSF包实现,或有其他方法.在此谢了。