Excel操作:HSSFworkbook,XSSFworkbook,SXSSFworkbook區別總結

用JavaPOI導出Excel時,我們需要考慮到Excel版本及數據量的問題。針對不同的Excel版本,要採用不同的工具類,如果使用錯了,會出現錯誤信息。JavaPOI導出Excel有三種形式,他們分別是1.HSSFWorkbook  2.XSSFWorkbook  3.SXSSFWorkbook。

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,擴展名是.xls;

XSSFWorkbook:是操作Excel2007後的版本,擴展名是.xlsx;

SXSSFWorkbook:是操作Excel2007後的版本,擴展名是.xlsx;

 

第一種:HSSFWorkbook

poi導出excel最常用的方式;但是此種方式的侷限就是導出的行數至多爲65535行,超出65536條後系統就會報錯。此方式因爲行數不足七萬行所以一般不會發生內存不足的情況(OOM)。

 

第二種:XSSFWorkbook

這種形式的出現是爲了突破HSSFWorkbook的65535行侷限。其對應的是excel2007(1048576行,16384列)擴展名爲“.xlsx”,最多可以導出104萬行,不過這樣就伴隨着一個問題---OOM內存溢出,原因是你所創建的book sheet row cell等此時是存在內存的並沒有持久化。

 

第三種:SXSSFWorkbook

從POI 3.8版本開始,提供了一種基於XSSF的低內存佔用的SXSSF方式。對於大型excel文件的創建,一個關鍵問題就是,要確保不會內存溢出。其實,就算生成很小的excel(比如幾Mb),它用掉的內存是遠大於excel文件實際的size的。如果單元格還有各種格式(比如,加粗,背景標紅之類的),那它佔用的內存就更多了。對於大型excel的創建且不會內存溢出的,就只有SXSSFWorkbook了。它的原理很簡單,用硬盤空間換內存(就像hash map用空間換時間一樣)。

SXSSFWorkbook是streaming版本的XSSFWorkbook,它只會保存最新的excel rows在內存裏供查看,在此之前的excel rows都會被寫入到硬盤裏(Windows電腦的話,是寫入到C盤根目錄下的temp文件夾)。被寫入到硬盤裏的rows是不可見的/不可訪問的。只有還保存在內存裏的纔可以被訪問到。

SXSSF與XSSF的對比:

a. 在一個時間點上,只可以訪問一定數量的數據

b. 不再支持Sheet.clone()

c. 不再支持公式的求值

d. 在使用Excel模板下載數據時將不能動態改變表頭,因爲這種方式已經提前把excel寫到硬盤的了就不能再改了

 

當數據量超出65536條後,在使用HSSFWorkbook或XSSFWorkbook,程序會報OutOfMemoryError:Javaheap space;內存溢出錯誤。這時應該用SXSSFworkbook。

 

參考鏈接:https://blog.csdn.net/qq_34869143/article/details/76512289

                    https://blog.csdn.net/sophie2805/article/details/79246889

                    https://blog.csdn.net/qq_29631809/article/details/72785338

發佈了16 篇原創文章 · 獲贊 22 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章