poi大資料量產生excel

來源:互聯網
上載者:User

使用poi產生excel,當遇到大資料量時,會有幾個問題:

 

1. 目前office2003 excle每個sheet最大支援行數為65536,當資料超過65536行時,會報異常

2. 當列為17列左右,資料行數達到50w條左右時,會包OOM錯誤

Exception in thread "15124183@qtp-16902686-1" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Thread-13" java.lang.OutOfMemoryError: Java heap space
        at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:141)
        at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:119)

 

問題1比較好解決,每次寫入資料時,都擷取sheet最後一行,在最後一行後繼續寫入資料,判斷當最大行數大於65536或再小些,產生新的sheet,就能解決此問題。

具體程式碼片段

   int sheetLastSize = sheet.getLastRowNum();
            // 如果資料是最大寫入數的整數倍(Constants.EXCEL_SHEET_DATASIZE為最大行數)
            if (sheetLastSize >= Constants.EXCEL_SHEET_DATASIZE) {
                sheet = workbook.createSheet();
                sheetLastSize = sheet.getLastRowNum();
                log.info("sheetLast Size:=========" + sheetLastSize);
                mapInfo.put("sheet", sheet);
                // 處理標題頭
                processExcelTitle(dataset, workbook, sheet);
            }

 

問題2 目前沒有較好的解決辦法。由於每行都要產生多個cell對象,當資料量大時,java GC還沒來得及回收,導致最後沒有記憶體建立cell對象。現在正測試一種方法(只是暫時緩解,不是最好的辦法),每次寫入資料後,把row賦值null,定時調用System.GC();沒有別的好辦法,只能暫時測試下。

還是不行,仍然溢出!

 

 

 

/**
     * 傳入已存在的workbook和資料來源,向excel中追加資料,每個sheet大於指定行數時,建立新的sheet
     *
     * @param workbook
     *            已存在的工作薄
     * @param dataset
     *            寫入資料集合
     * @param mapInfo
     *                 準備資料map
     */
    @SuppressWarnings("unchecked")
    private void dynamicExcel(HSSFWorkbook workbook, Map<String, Object> dataset, Map<Object, Object> mapInfo) {
        Map<String, String> headers = (Map<String, String>) dataset.get("1");
        Iterator<Entry<String, String>> titleIter = headers.entrySet().iterator();

        // 取得所有行的資料
        List<Map<String, String>> valueList = (List<Map<String, String>>) dataset.get("2");
        wroteRecodeSize += valueList.size();
        log.info("this times size is:------------------------------------------------------" + valueList.size());
        log.info("total wrote recode size is:------------------------------------------------" + wroteRecodeSize);
        HSSFSheet sheet = (HSSFSheet) mapInfo.get("sheet");
        for (int i = 0; i < valueList.size(); i++) {
            int sheetLastSize = sheet.getLastRowNum();
            // 如果資料是最大寫入數的整數倍
            if (sheetLastSize >= Constants.EXCEL_SHEET_DATASIZE) {
                sheet = workbook.createSheet();
                sheetLastSize = sheet.getLastRowNum();
                log.info("sheetLast Size:=========" + sheetLastSize);
                mapInfo.put("sheet", sheet);
                // 處理標題頭
                processExcelTitle(dataset, workbook, sheet);
            }
            // 追加行
            HSSFRow row = sheet.createRow(sheetLastSize + 1);
            sheet.setDefaultColumnWidth(25);
            // 取得一行所有記錄的所有值
            int dataIndex = 0;
            Map<String, String> values = valueList.get(i);
            titleIter = headers.entrySet().iterator();
            while (titleIter.hasNext()) {
                Map.Entry<String, String> entry = (Map.Entry<String, String>) titleIter.next();
                String key = entry.getKey();
                HSSFCell cell = row.createCell(dataIndex++);
//                String v = values.get(key);
                cell.setCellValue(values.get(key));
            }
           
        }
    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.