1. 程式人生 > >POI操作Excel時最大行、列數的問題及寫大量資料時Java heap space記憶體溢位解決

POI操作Excel時最大行、列數的問題及寫大量資料時Java heap space記憶體溢位解決

如果你從開始選單中啟動excel2007,預設是:
1048576
如果你儲存或者開啟型別為excel工作簿(.xlsx):
1048576

如果你儲存或者開啟型別為97-2003工作簿(.xls):
65536
public class MaxRowsTest {

	public static void main(String[] args) {
		
		SXSSFWorkbook wb = new SXSSFWorkbook();
		Sheet sheet = wb.createSheet();
		
		
		for (int i = 0; i < 1048577; i++) {
			Row row = sheet.createRow(i);
			Cell cell = row.createCell(0);
			cell.setCellValue("我是第:" + i + " 條資料");
		}
		File file = new File("C:\\Users\\Administrator\\Desktop" + File.separator + "MaxRows.xlsx");
		OutputStream os;
		try {
			os = new FileOutputStream(file);
			wb.write(os);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}


當寫入的資料超過最大限制時:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:92)
at com.energyfuture.poitest.MaxRowsTest.main(MaxRowsTest.java:34)
寫大量資料時,發生 Java heap space 記憶體溢位時的解決辦法:

是用最新版的poi ,這個問題已經解決了,利用快取的cell,不建立更多的物件例項,導致heap 回收不了。SXSSFWorkbook關鍵是這個類的使用

Java程式碼  收藏程式碼
  1. FileOutputStream out = new FileOutputStream(new File("D://result.xlsx"));  
  2.         Workbook writeWB = new SXSSFWorkbook(500);  
  3.         Sheet writeSheet = writeWB.createSheet();  
  4.         for (int rr = 0; rr < 400000; rr++) {  
  5.             Row writeRow = writeSheet.createRow(rr);  
  6.             for (int cc = 0; cc < 10; cc++) {  
  7.                 writeRow.createCell(cc).setCellValue("測試" + rr + "," + cc);  
  8.             }  
  9.         }  
  10.         writeWB.write(out);