導出類
用JavaPOI導出Excel時赡勘,需要考慮到Excel版本及數(shù)據(jù)量的問題从橘。
針對不同的Excel版本矩距,要采用不同的工具類拗盒,如果使用錯了,會出現(xiàn)錯誤信息锥债。
JavaPOI導出Excel有三種形式:1.HSSFWorkbook ?2.XSSFWorkbook??3.SXSSFWorkbook陡蝇。
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,擴展名是.xls哮肚;
XSSFWorkbook:是操作Excel2007后的版本登夫,擴展名是.xlsx;
SXSSFWorkbook:是操作Excel2007后的版本允趟,擴展名是.xlsx恼策;
一、HSSFWorkbook
poi導出excel最常用的方式潮剪;但是此種方式的局限就是導出的行數(shù)至多為65535行涣楷,超出65536條后系統(tǒng)就會報錯(OOM)
導入的包:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
二、XSSFWorkbook
為了突破HSSFWorkbook的65535行局限抗碰。其對應的是excel2007(1048576行狮斗,16384列)擴展名為“.xlsx”,最多可以導出104萬行弧蝇,不過這樣就伴隨著一個問題---OOM內(nèi)存溢出碳褒,原因是所創(chuàng)建的book sheet row cell等此時是存在內(nèi)存的并沒有持久化。
三看疗、SXSSFWorkbook
從POI 3.8版本開始骤视,提供了一種基于XSSF的低內(nèi)存占用的SXSSF方式。對于大型excel文件的創(chuàng)建鹃觉,一個關鍵問題就是专酗,要確保不會內(nèi)存溢出。其實盗扇,就算生成很小的excel(比如幾Mb)祷肯,它用掉的內(nèi)存是遠大于excel文件實際的size的。如果單元格還有各種格式疗隶,那占用的內(nèi)存就更多佑笋。對于大型excel的創(chuàng)建且不會內(nèi)存溢出的,就只有SXSSFWorkbook了斑鼻。原理是用硬盤空間換內(nèi)存蒋纬。SXSSFWorkbook是streaming版本的XSSFWorkbook,它只會保存最新的excel rows在內(nèi)存里供查看,在此之前的excel rows都會被寫入到硬盤里(Windows電腦的話,是寫入到C盤根目錄下的temp文件夾)蜀备。被寫入到硬盤里的rows是不可見的/不可訪問的关摇。只有還保存在內(nèi)存里的才可以被訪問到。
SXSSF與XSSF的對比:
a. 在一個時間點上碾阁,只可以訪問一定數(shù)量的數(shù)據(jù)
b. 不再支持Sheet.clone()
c. 不再支持公式的求值
d. 在使用Excel模板下載數(shù)據(jù)時將不能動態(tài)改變表頭输虱,因為這種方式已經(jīng)提前把excel寫到硬盤的了就不能再改了
當數(shù)據(jù)量超出65536條后,在使用HSSFWorkbook或XSSFWorkbook脂凶,程序會報OutOfMemoryError:Javaheap space;內(nèi)存溢出錯誤宪睹。這時應該用SXSSFworkbook
導入的包:
4.0.0版本的JDK需要1.8以上,如果JDK是1.7的蚕钦,那么就使用3.9版本的依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>