1. 程式人生 > >HSSF、XSSF和SXSSF區別以及Excel導出優化

HSSF、XSSF和SXSSF區別以及Excel導出優化

基本 per springmvc linu cell exce 功能 pch 臨時文件

  之前有寫過運用POI的HSSF方式導出數據到Excel(見:springMVC中使用POI方式導出excel至客戶端、服務器實例),但這種方式當數據量大到一定程度時容易出現內存溢出等問題。

  首先,POI提供了HSSF、XSSF以及SXSSF三種方式操作Excel。他們的區別如下:

HSSF:是操作Excel97-2003版本,擴展名為.xls。

XSSF:是操作Excel2007版本開始,擴展名為.xlsx。

SXSSF:是在XSSF基礎上,POI3.8版本開始提供的一種支持低內存占用的操作方式,擴展名為.xlsx。

  其次,大家需要了解下Excel不同版本的一些區別,這些限制其實間接的局限了POI提供的API功能。

1、支持的行數、列數

Excel97-2003版本,一個sheet最大行數65536,最大列數256。

Excel2007版本開始,一個sheet最大行數1048576,最大列數16384。

2、文件大小

.xlsx文件比.xls的壓縮率高,也就是相同數據量下,.xlsx的文件會小很多。

3、兼容性

Excel97-2003版本是不能打開.xlsx文件的。

Excel2007開始的版本是可以打開.xls文件的。

  根據以上內容,大家可以根據自己的需求進行選擇,當然海量數據的導出肯定是推薦SXSSF的方式。編碼過程中,其實不同方式的使用方式基本相同,所以互相切換也是比較簡單的,只要把帶有前綴的接口改成對應的就行了。如:

HSSF對應:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……

XSSF對應:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……

SXSSF對應:SXSSFWorkbook、Sheet、Row、Cell……

  規律還是挺明顯的吧,除了workbook,SXSSF的接口都不帶前綴,另外兩種方式的各個接口都帶有對應的前綴。

  另外,前面有提到SXSSF是一種低內存占用的操作方式,因為其提供了一個新的方法:

SXSSFWorkbook w3= new
SXSSFWorkbook(100);//內存中保留100條數據,其余寫入硬盤臨時文件

在數據量超過設置的值時,會在硬盤生成臨時文件保存之前的數據,而且POI會根據規則自動刪除生成的這些臨時文件。

  其實到這裏已經結束了,但在好奇心的驅使下,個人想看看POI生成的臨時文件。所以查了一下,大家說是在系統的緩存文件夾下會產生類似的臨時文件,如:

poi-sxssf-sheet6849116696956134782.xml

根據操作系統的不同,通常目錄如下:

Windows7: C:\Users\xxxx\AppData\Local\Temp (xxxx為windows用戶名)

Linux: /var/tmp/

但並沒有找到,後來在tomcat的臨時文件夾下找到了,如:D:\Tomcat_7.0.42\temp。

於是又科普了一下,發現是tomcat的原因,因為在tomcat上運行的應用會通過java.io.tmpdir系統變量獲取到臨時文件的目錄。

大家可以通過下面的語句查看自己應用的臨時文件目錄:

System.out.println(System.getProperty("java.io.tmpdir"));

雖然POI會根據規則自動刪除臨時文件,但是知道了文件路徑,大家也可以根據實際情況,看是否刪除這些臨時文件。

HSSF、XSSF和SXSSF區別以及Excel導出優化