POI操作Excel時最大行、列數的問題及寫大量資料時Java heap space記憶體溢位解決
阿新 • • 發佈:2019-02-08
如果你從開始選單中啟動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程式碼- FileOutputStream out = new FileOutputStream(new File("D://result.xlsx"));
- Workbook writeWB = new SXSSFWorkbook(500);
- Sheet writeSheet = writeWB.createSheet();
- for (int rr = 0; rr < 400000; rr++) {
- Row writeRow = writeSheet.createRow(rr);
- for (int cc = 0; cc < 10; cc++) {
- writeRow.createCell(cc).setCellValue("測試" + rr + "," + cc);
- }
- }
- writeWB.write(out);