當前位置:編程學習大全網 - 源碼下載 - HSSF XSSF SXSSF

HSSF XSSF SXSSF

1.創建工作簿Workbook

2.創建Sheet

3.創建行Row

4.創建單元格Cell

HSSFWorkbook是操作Excel2003以前(包括2003)的版本,擴展名為.xls,所以每個Sheet局限就是導出的行數至多為65535行,壹般不會發生內存不足的情況(OOM)。

這種形式的出現是由於HSSFWorkbook的局限性而產生的,因為其所導出的行數比較少,並且只針對Excel2003以前(包括2003)的版本的版本,所以 XSSFWookbook應運而生,其對應的是EXCEL2007以後的版本(1048576行,16384列)擴展名.xlsx,每個Sheet最多可以導出104萬行,不過這樣就伴隨著壹個OOM內存溢出的問題,原因是妳所創建的sheet row cell 等此時是存在內存中的,隨著數據量增大 ,內存的需求量也就增大,那麽很大可能就是要OOM了。

從POI 3.8版本開始,提供了壹種基於XSSFWorkbook的低內存占用的工作簿SXSSFWorkbook。

引用官方的介紹,簡單概括就是:

SXSSF是對XSSF的壹種流式擴展, 特點是采用了滑動窗口的機制,低內存占用 ,主要用於數據量非常大的電子表格而虛擬機堆有限的情況。

原理是利用了滑動窗口機制。

SXSSFWorkbook.DEFAULT_WINDOW_SIZE默認值是100,表示在內存中最多存在100個Row對象,當寫第101個Row對象的時候就會把第1個Row對象以XML格式寫入C:\Users\wange\AppData\Local\Temp路徑下的臨時文件中,後面的以此類推,始終保持內存中最多存在100個Row對象。

SXSSFWorkbook默認使用內聯字符串而不是 ***享字符串表 (SharedStringsTable)。啟用***享字符串時,文檔中的所有唯壹字符串都必須保存在內存中,因此會占用更多的內存。

與XSSF的對比,在壹個時間點上,只可以訪問壹定數量的Row;不再支持Sheet.clone();不再支持公式的求值。但是除了滑動窗口,其余的EXCLE操作仍然使用的是XSSF的API。

另外官方提示導出EXCEL後應該調用wb.dispose()來刪除之前保存的臨時文件。

wb.write(out)通過源碼了解到過程是

1、將wb的所有sheet調用flushRows()移出內存,寫入臨時.xml文件中

2、生成了壹個臨時.xlsx文件將wb的壹些模板數據寫入這個臨時文件

3、將這個臨時.xlsx文件轉成ZipFile,遍歷所有ZipEntry來獲取Sheet,如果沒有Sheet則直接復制流。

4、如果能夠獲取到Sheet的則是那些臨時.xml文件,在對這些文件進行解析並追蹤寫入導出文件中。

(這邊可能是涉及到了壹些EXCEL文件格式的原理,就不深入研究了)

SXSSFWorkbook wb = new SXSSFWorkbook(-1)

初始化設置為-1的時候我們可以自己定義寫臨時文件規則,比如每讀1000行記錄flush到臨時壹次,可以大大減少磁盤IO次數。

使用SAX模型來解析EXCEL不像DOM模型壹下把所有文件內容加載進內存,它逐行掃描文檔,壹邊掃描,壹邊解析。所以那些只需要單遍讀取內容的應用程序就可以從SAX解析中受益,這對大型文檔的解析是個巨大優勢。

  • 上一篇:數量指標有哪些?
  • 下一篇:股市K線圖中MACD的線是什麽意思怎樣看懂
  • copyright 2024編程學習大全網