今天使用了npoi的HSSFWorkbook導出excel,卻出現文件損壞或擴展名不對錯誤,後來發現尾碼只要是“xls”就可以了。 npoi只是java poi的實現版,因此HSSFworkbook,XSSFworkbook,SXSSFworkbook這三種的區別在npoi中同理。 下麵轉自:htt ...
今天使用了npoi的HSSFWorkbook導出excel,卻出現文件損壞或擴展名不對錯誤,後來發現尾碼只要是“xls”就可以了。
npoi只是java poi的實現版,因此HSSFworkbook,XSSFworkbook,SXSSFworkbook這三種的區別在npoi中同理。
下麵轉自:https://blog.csdn.net/YiQ2018/article/details/81458149
用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
————————————————
版權聲明:本文為CSDN博主「YiQ2018」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/YiQ2018/article/details/81458149