2013-05-16 59 views
0

我有一個場景,我使用SXSSF工作簿(約1-2百萬)創建了一個非常大的xlsx文件。Apache POI-SX​​SSFWorkbook - 阻止排隊沖洗

  • 當寫紙,我必須動態填充一些值說,只有在板的第1行頭

問題: 由於其流API,如果我100000列,第並想在Row1中填充一些值,這時我的Row 1被刷新並嘗試寫入它不可用。

問題: 1.我可以阻止任何行從沖洗? 2.你可以想到的任何解決方案?

我想保存Row1值,刷新整個工作簿,再次讀入工作簿,創建Row1並再次刷新。

更好的解決方案請....

+0

爲您的服務器購買更多內存,然後使用定期的'XSSFWorkbook',它允許同時對整個工作簿進行完整的讀/寫訪問? – Gagravarr

+0

:)是的,我們可以,但現在我們沒有增加的規定。任何想法pl? – Raja

回答

2

很簡單,你不能。 SXSSF是文件格式的流式寫入器。一旦一組行從緩衝區中傳出,它們將被寫入磁盤,轉換爲需要排序的文件格式。那時,他們已經走了,不能改變,因爲其他事情已經發生。

如果您需要對整個工作簿進行完全讀寫訪問,則需要切換到全功能XSSFWorkbook。這將緩衝內存中的所有內容,所以只要你願意,你可以改變你喜歡的任何部分,因爲它只在寫入文件時被排序。

XSSFWorkbook確實需要比SXSSFWorkbook更多的內存,因爲它將整個文件保留在內存中。你可能需要提高你的堆大小。儘管如此,對於大多數情況來說,內存比程序員便宜得多,所以只需要更多內存就可以了!

+0

解決任何人都需要它: - 爲了保持內存佔用低,沒有ram增加,不使用XSSF - 而是寫入到XLSX,我們最初寫入.csv文件,而實際上創建.xlsx時,我們正在寫頭將記錄從.csv複製並複製到.xlsx文件。 – Raja

0

解決方案讓任何人都需要它: - 爲了保持內存佔用低,沒有ram增加,不使用XSSF - 而是寫入到XLSX,我們最初寫入.csv文件,而實際上創建.xlsx時,我們寫入標題行並將記錄從.csv複製到.xlsx文件。