EXCEL大數據量導出的解決方案(轉)


將web頁面上顯示的報表導出到excel文件里是一種很常見的需求。潤乾報表的類excel模型,支持excel文件數據無失真的導入導出,使用 起來非常的方便。然而,當數據量較大的情況下,excel本身的支持最多65535行數據的問題便凸顯出來。下面就給出大數據量導出到excel的解決方 案。

首先,對於數據超過了65535行的問題,很自然的就會想到將整個數據分塊,利用excel的多sheet頁的功能,將超出65535行后的數據寫入到下一個sheet頁中,即通過多sheet頁的方式,突破了最高65535行數據的限定。

具體做法就是,單獨做一個鏈接,使用JSP導出,在JSP上通過程序判斷報表行數,超過65535行后分SHEET寫入。這樣這個問題就得以解決了。

更進一步地說,在這種大數據量的報表生成和導出中,要占用大量的內存,尤其是在使用TOMCAT的情況下,JVM最高只能支持到2G內存,則會發生 內存溢出的情況。此時的內存開銷主要是兩部分,一部分是該報表生成時的開銷,另一部分是該報表生成后寫入一個EXCEL時的開銷。由於JVM的GC機制是 不能強制回收的,因此,對於此種情形,我們給出一個變通的解決方案。

首先,將該報表設置起始行和結束行參數,在API生成報表的過程中,分步計算報表,比如一張20萬行數據的報表,在生成過程中,可通過起始行和結束 行分4-5次進行。這樣,就降低了報表生成時的內存占用,在后面報表生成的過程中,如果發現內存不夠,即可自動啟動JVM的GC機制,回收前面報表的緩 存。

導出EXCEL的過程,放在每段生成報表之后立即進行,改多個SHEET頁為多個EXCEL,即在分步生成報表的同時分步生成EXCEL,則通過 POI包生成EXCEL的內存消耗也得以降低。通過多次生成,同樣可以在后面EXCEL生成所需要的內存不足時,有效回收前面生成EXCEL時占用的內 存。

再使用文件操作,對每個客戶端的導出請求在服務器端根據SESSIONID和登陸時間生成唯一的臨時目錄,用來放置所生成的多個EXCEL,然后調 用系統控制台,打包多個EXCEL為RAR或者JAR方式,最終反饋給用戶一個RAR包或者JAR包,響應客戶請求后,再次調用控制台刪除該臨時目錄。

使用這種方法,首先是通過分段運算和生成,有效降低了報表從生成結果到生成EXCEL的內存開銷。其次是通過使用壓縮包,響應給用戶的生成文件體積 大大縮小,降低了多用戶並發訪問時服務器下載文件的負擔,有效減少多個用戶導出下載時服務器端的流量,從而達到進一步減輕服務器負載的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM