用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);
}
}
代码大致如下:
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);
}
}
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);
}
}
內存溢出,不是我剛才所說的,而是因為java的堆棧空間不夠大,所以導致內存溢出
-----------------------------------能说得清楚一点么?我这里的要求是,从某个数据库中查询得到数据,写到excel表里去~~可能会有数万条,怎么样分批倒呢?