在剛畢業那會,作項目全是服務器控件。導出Excel的代碼也很簡單,在button觸發後臺事件後,後臺生成一個excel文件,而後讀取成字節,輸出到客戶端。html
Response.AddHeader("Content-Disposition", "attachment; filename=test.csv"); Response.ContentType = "application/ms-excel"; Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312"); Response.BinaryWrite(by); //Excel文件字節數組 Response.End();
用ExtJS寫UI,前臺就沒法使用任何服務器控件。同時也藉此來表明純用html控件來實現的頁面,交互一般使用Ajax。說說我當時的作法,用幾行僞代碼表示。json
$("#Excel").click(function(){ $.post('/url',{name:"111"},function(rdto){ if(!rdto.Result) { alert(rdto.Message || '系統出錯!'); return; } var fileName = rdto.data; //打開新頁面去下載文件 window.open('file.aspx?fileName'+fileName,'xxx-xx'); }); },'json');
思路則是,先將數據提交到後臺,後臺生成一個臨時的Excel文件,而後將文件名返回給js,js在新開一個頁面去下載Excel。這種方式,通常就會帶來一個問題,新開的頁面常常會被攔截,點擊容許彈窗以後,瀏覽器又會刷新,而後再次點擊導出,上次點擊導出Excel臨時生成的文件還在那靜靜的躺着。數組
上面的方法太蛋疼,生成一個臨時文件,有可能尚未立馬刪除。在用一段僞代碼表示。瀏覽器
$("body").append("<iframe src='/home/excel?name=1'/>");
這樣就能夠經過iframe發起一個get請求,後臺按照asp.net的寫法就能夠了。服務器
可是get請求沒法傳遞大量數據,系統要傳遞大量數據怎麼辦。好比說,直接把某個控件的html代碼,或者是頁面的html代碼導出在Excel裏。談談樓主目前的想法:app
首先發起一個post請求傳參,後臺存到Session中去,而後再發起上面的get請求,請求中去根據這個數據來生成文件。asp.net
若是頁面導出的數據來自於表單內容,能夠經過form來操做,這裏就很簡單了,跟Asp.Net相似。form表單提交的地址,直接返回一個文件流。而form支持post和get,因此能夠根據要求本身選擇。post
固然也能夠window.location.href = '/home/excel?t=1&...'; 後臺來返回文件流。url
方式不少,你們根據場景自行選擇。spa