Web導出excel的幾種方法

[size=medium]在項目中我們經常遇到需要將報表導出成excel下載保存下來,在不同的要求和不同的資源情況下我們有不同的處理方式。在這裏我將談談我所遇到的幾種情況和遇到的一些問題。
總的來說可以分爲:服務器端生成和瀏覽器端生成2種方法。

一、 服務器端生成就是:根據用戶請求,獲取相應的數據,使用poi/jxl, jacob/jawin+excel或是用數據拼html的table或是cvs純文本的數據格式等。然後按.xls或是.cvs格式的文件的形式返回給用戶,指定Content-Type:application/vnd.ms-excel ,瀏覽器就會提示要下載的文件是excel文件。一般情況下采用這種方式的話就可以根據具體要求對excel文件進行細緻的處理,各方面樣式和排列可以自己控制使用,而且是可以跨平臺使用的。缺點就是畢竟需要根據不同的表格進行不斷的coding,服務器也有一定的壓力,這裏我就不進行例子解釋了。
二、瀏覽器端生成excel文件還沒有特別完善的方案,這是因爲js無法處理二進制。大概有以下幾個方案,各有利弊
1.activex方式:使用js調用excel對象,傳入需要的參數直接導出excel。
這種方式代碼簡單,速度較快,前段時間用過2種採用這種方式的方法,各有千秋:
A:頁面table拷貝法:
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
var oWB = oXL.Workbooks.Add(); //創建AX對象excel
var oSheet = oWB.ActiveSheet; //獲取workbook對象
var sel = document.body.createTextRange(); //激活當前sheet
sel.moveToElementText(curTbl); //把表格中的內容移到TextRange中
sel.select(); //全選TextRange中內容
sel.execCommand("Copy"); //複製TextRange中內容
oSheet.Paste(); //粘貼到活動的EXCEL中
oXL.Visible = true; //設置excel可見屬性
如上代碼可見,這個方法需要傳入的就是table的ID,通過拷貝table複製到excel的方式執行,這個方法的特點是可見即所得,當然頁面格子大小不能控制精細,只能得到當前頁面展示的table部分,如table做了分頁處理的話,直接導出的也只是當前頁面部分。
B: 頁面地址輸出法:
var e = new ActiveXObject("Excel.Application");
var b = e.workbooks.open(src);
e.visible = true;
這個方法更加簡單,src爲所用導出頁面的地址,就直接導出的這張頁面爲內容的excle,當然src也可以包含參數,但是經過試驗,帶參數會這頁面第一次刷新的時候參數處理有些問題,需要捕獲並處理,相信這個方法只導表有些大材小用,因爲他導出的是整個頁面。.
2.ie命令方式:將html或是csv輸出到open的window,然後使用execCommand的saveas命令,存爲csv或xls(IE 6 only)
3. 服務器端中轉方式:將html的table或是拼接的csv傳到服務器端,服務器端再按照Content-Type:application/vnd.ms-excel返回,瀏覽器就會按excel方式處理。與服務器端拼接相比,少了一次取數操作。
4. data協議方式:對於支持data協議的瀏覽器,可以將html或是csv先用js base64處理,然後前綴data:application/vnd.ms-excel;base64,,即可使瀏覽器將其中的數據當做excel來處理,瀏覽器將提示下載或打開excel文件,可惜的是ie不支持。extjs的官網有一個grid的plugin,實現導出xhtml格式的僞excel文件,就是這麼做的。

瀏覽器端只有第一種方案導出的是真正的biff格式的excel文件,其他方式都是文本格式。activex方式只能在windows平臺的ie瀏覽器使用,而且需要降低ie的安全性,所以應用比較有限。複雜的excel文件,還是在服務器端用poi/jxl生成excel比較好。如果瀏覽器固定位ie6,瀏覽器端方式2是最好的方案。如果要降低服務器端cpu的計算壓力,客戶端方案3可行,而且跨平臺(比poi/jxl方式少了取數和生成二進制文件)。如果是非ie瀏覽器,方案4也不失爲一種好方法。

ps: 還有一個方案,就是讓安裝了ie和excel的用戶在網頁上右鍵,點擊“導出到 Microsoft Excel”,然後可以選擇要導出的table區域,點“導入”按鈕,完成導入。
[/size]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章