2012-08-30 111 views
3

我有一個生成的excel報告。大多數情況下,當行數達到2000時,它工作正常。當行> 10000時,jxls文件生成將永遠掛起

今天早上,我試圖生成爲11000行和無法弄清楚,爲什麼它會只是掛,因爲它是遵循同樣不變的代碼的報告 - 見下文。除了XLSTransformer可能真的很慢以外,我仍然無法弄清楚。

List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>(); 
    Map<String, Object> sheetData = null; 
    for(EntityForecastWrapper wrapper : wrappers) { 
     sheetName = Integer.toString(wrapper.getEntityId()); 
     sheetNames.add(sheetName); 
     sheetData = new HashMap<String, Object>(); 
     sheetData.put("wrapper", wrapper); 
     maps.add(sheetData); 
    } 
    Map<String, Object> beansMap = new HashMap<String, Object>(); 
    Workbook workbook = null; 
    XLSTransformer transformer = new XLSTransformer(); 
    try { 
     Logger.getLogger(getClass()).error("generating excel"); 
     InputStream is = getClass().getResourceAsStream(getReportTemplate().getLabel()); 
     workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0); 
     Logger.getLogger(getClass()).error("generated excel"); 
     /*FileOutputStream fos = new FileOutputStream(new File(fileName)); 
     workbook.write(fos); 
     fos.flush(); 
     fos.close();*/ 
    } catch(Exception e) { 
     Logger.getLogger(getClass()).error("Error writing excel data: ", e); 
    } 

的代碼基本上都不來自行回:

workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0); 

這是非常快,當行數不是很大(例如,500到1000行)。該行的內容不會改變,列同#...

任何想法?

謝謝!

回答

4

JXLS嘗試馬上就構建在RAM中的整個文檔。我快速轉過了code,發現jxls在內部使用POI HSSFWorkbook - 沒有流來幫助處理大量的數據。

可能的工作一個解決辦法是處理較小的部分數據(對我來說〜1000個條目),並保存JXLS的輸出臨時文件系統上。處理完所有數據後,使用poi合併文件。不是一個非常漂亮的解決方案......

1

在我們的情況下,當JXLS模板使用dynamic columns或其他標記發生這種情況。當我們有一個簡單的模板只需${name}屬性訪問,然後它運行得很快。我們已經切換到指導POI API以獲得更復雜的報告。

更新:也處理的XLSX模板消耗更多的內存,則XLS模板。