我們有一個預先創建的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 - 他們沒有幫助啓動時間。
您只想將數據複製到「數據表」中? – ArtiBucco
是的,你是對的!這就是我需要做的.. – lramakri