2012-08-23 44 views
2

我們有一個預先創建的excel文件,其中包含交叉參考工作表的花式圖表和公式。它也包含宏。源數據應該被複制粘貼到一張表中,而其餘的工作簿則由已有的接線填充。XSSFWorkbook的構建對於.xlsm工作簿非常緩慢

注意:我真的不在乎在本工作手冊中閱讀/修改其他工作表,我只是需要將每次拷貝粘貼原始數據的痛苦都保存在本工作手冊的這個數據表中。

我正在使用Apache POI並嘗試從此「模板」excel文件創建XSSFWorkbook實例。然而,這個對象的構建需要很長時間(在許多運行中幾乎持續一分鐘)。 excel文件本身只有400KB左右,不是一個大文件。我使用jconsole對它進行了描述,似乎它不受CPU或堆的限制 - 它僅使用大約90 MB的堆內存(我已經用2GB的堆確保了堆內存)和52%左右的CPU。

實際用原始數據填充數據表並將最終更新文件寫出(大約3-4秒)需要很短的時間。這裏是我的啓動代碼:

public static void startup() throws FileNotFoundException, IOException { 
    long start = System.nanoTime(); 
    System.out.println("Started..."); 
    TEMPLATE_WORKBOOK = new XSSFWorkbook(new FileInputStream(new File(TEMPLATE))); 
    long end = (System.nanoTime() - start)/NANOS; 
    System.out.println("It took " + end + " seconds.."); 
} 

我想過一旦加載了這個TEMPLATE_WORKBOOK,然後再用相同的句柄爲每個後續請求寫入新的數據 - 我模擬這個有休眠和永遠,而在我的主類。但我不能這樣做,顯然,我有一個異常「線程中的異常」主「org.apache.xmlbeans.impl.values.XmlValueDisconnectedException」。 TEMPLATE_WORKBOOK對象不可重複使用。

我確實看到有一個基於事件的API,但在進入它之前,我想看看我是否在這裏錯過了一些東西!同樣,內存/ CPU在這裏不是問題,我們有足夠的空間來備用。我正在努力縮短時間。

P.S:我嘗試了這裏的提示:XSSFWorkbook takes a lot of time to load - 他們沒有幫助啓動時間。

+0

您只想將數據複製到「數據表」中? – ArtiBucco

+0

是的,你是對的!這就是我需要做的.. – lramakri

回答

1

我認爲你對於你想要做的事情處於不利的位置。我遇到了同樣的問題(請參閱here),但不幸的是您的案例中沒有解決方案。

即使您希望在數據表中恰到好處,唯一的辦法就是將文件作爲XSSFWorkbook打開,即使在基於事件的API中也是如此。

SXSSFWorkbook不能從File,InputStream或OPCPackage構造。您只能從頭開始或從XSSFWorkbook開始構建它。

唯一真正aweful時間consumming可能的解決方案(我不知道這是否是可能的)是嘗試輸入與讀取分析程序中的數據,這意味着你應該解析excel文件轉換成XML你自己。

我們的最終解決方案是等待解決我們問題的解決方案。

對不起,你不能有你想要的答案。