excel導出注意點

常用EXCEL有Excel2013、2010、2007和老一點的Excel2003較爲多見

POI操作EXCEL對象
HSSF:操作Excel 97(.xls)格式 是操作Excel2003以前(包括2003)的版本,擴展名是.xls;
如果想用HSSFWorkbook導出更大行數的excel。(分sheet頁)那需要設置更大的運行內存,最大行數取決你的運行虛擬內存。
例如:
修改VM arguments爲“-Xms64m -Xmx512m -XX:MaxPermSize=512m“,那麼能導出最大的行數在333680~331680之間。

本博提供相關工具類 Poi使用HSSFWorkbook方式導出Excel工具類
XSSF:操作Excel 2007(.xlsx)格式,操作EXCEL內存佔用高於HSSF
POI之前的版本不支持大數據量處理,如果數據過多則經常報OOM錯誤,有時候調整JVM大小效果也不是太好。
SXSSF:從POI3.8 beta3開始支持,基於XSSF,低內存佔用。只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
本博提供相關工具類 Poi使用SXSSFWorkbook方式導出Excel工具類

使用POI的HSSF對象,生成Excel 97(.xls)格式,生成的EXCEL不經過壓縮直接導出。
線上問題:負載服務器轉發請求到應用服務器阻塞,以及內存溢出 。
如果系統存在大數據量報表導出,則考慮使用POI的SXSSF進行EXCEL操作。

HSSF生成的Excel 97(.xls)格式本身就有每個sheet頁不能超過65536行數據,256列的限制。

XSSF生成Excel2007-2010的版本(它的一張表最大支持1048576行,16384列)(.xlsx)格式,條數增加了,每個sheet頁104萬行,但是導出過程中,內存佔用率卻高於HSSF.

SXSSF是自3.8-beta3版本後,基於XSSF提供的低內存佔用的操作EXCEL對象。
其原理是可以設置或者手動將內存中的EXCEL行寫到硬盤中,這樣內存中只保存了少量的EXCEL行進行操作。
EXCEL的壓縮率特別高,能達到80%,12M的文件壓縮後才2M左右。
如果未經過壓縮、不僅會佔用用戶帶寬,且會導致負載服務器(apache)和應用服務器之間,
長時間佔用連接(二進制流轉發),導致負載服務器請求阻塞,不能提供服務。
針對 SXSSF Beta 3.8下,會有臨時文件產生,比如:
poi-sxssf-sheet4654655121378979321.xml
文件位置:java.io.tmpdir這個環境變量下的位置
Windows 7下是C:\Users\xxxxxAppData\Local\Temp
Linux下是 /var/tmp/

注:HSSFWorkbook和XSSFWorkbook的Excel Sheet導出條數上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列,如果數據量超過了此上限,那麼可以使用SXSSFWorkbook來導出。
實際上上萬條數據,甚至上千條數據就可以考慮使用SXSSFWorkbook了。
poi4.0.0版本的JDK需要1.8以上,如果JDK是1.7的,那麼就使用3.9版本的依賴

注意:
一定要注意文件流的關閉
也要防止前臺(頁面)連續觸發導出EXCEL
最終,這依賴於和客戶的溝通問題了,導出數據也要看情況,
一,爲了看,分sheet完全沒問題
二,數據遷移,這個導出幾個xls就行了
三,如果爲了分析或者其他原因,只能放在一個sheet頁,一匹馬拉火車是不可能的,起碼不能再用.xls格式了,
並且隨着數據量變大,導出時間,內存佔用也都是問題,07版本以後的excel每頁也僅能支持104萬左右

所以綜上來看,結合大數據量的導出效率,內存佔用,使用流行程度,建議導出爲.xlsx格式,採用較新的SXSSF實現
十萬級別的數據量,格式不限制的的可以採用hssf,excel爲03版本,只支持.xls格式,建議還是採用SXSSF方式
超大數據量採用SXSSF,excel爲07之後版本,只支持.xlsx格式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章