Posted on 2009-02-11 13:31
tangtb 閱讀(4714)
評論(7) 編輯 收藏 所屬分類:
ExtJs
解決有關(guān)Ext Grid導(dǎo)出Excel在JSP等環(huán)境中不可用的問題
有關(guān)ExtGrid導(dǎo)出Excel的實(shí)現(xiàn)方式,網(wǎng)上已經(jīng)有很多,官方也給出了一個(gè)方案,代碼不是很完善,不過已經(jīng)有高人對這個(gè)進(jìn)行了修正。具體實(shí)現(xiàn)方式及代碼我這里就不再多說了,大家可以參看:
http://www.dojochina.com/index.php?q=node/1254,附件:gridToExcel.js.txt
其基本思想是:客戶端根據(jù)Grid數(shù)據(jù)生成Excel格式的XML數(shù)據(jù),然后發(fā)送到一個(gè)服務(wù)端文件,服務(wù)端文件通
過設(shè)定Content-Type來實(shí)現(xiàn)Excel的下載。其中“導(dǎo)出Excel”按鈕點(diǎn)擊執(zhí)行的代碼如下:
1
if (Ext.isIE6 || Ext.isIE7 || Ext.isSafari || Ext.isSafari2 || Ext.isSafari3)
{
2
if (! Ext.fly('frmDummy'))
{
3
var frm = document.createElement('form');
4
frm.id = 'frmDummy';
5
frm.name = id;
6
frm.className = 'x-hidden';
7
document.body.appendChild(frm);
8
}
9
Ext.Ajax.request(
{
10
url: '/exportexcel.php',
11
method: 'POST',
12
form: Ext.fly('frmDummy'),
13
callback: function(o, s, r)
{
14
//alert(r.responseText);
15
},
16
isUpload: true,
17
params:
{exportContent: vExportContent}
18
})
19
} else
{
20
document.location = 'data:application/vnd.ms-excel;base64,' + Base64.encode(vExportContent);
21
}
例子中服務(wù)端使用的PHP,這段代碼在PHP中可能可以很好的工作,但是如果到了JSP等環(huán)境下,就出現(xiàn)了問
題,導(dǎo)出數(shù)據(jù)可能是空。
問題出在哪里呢?上面這部分代碼中的ajax提交其實(shí)并不是真正的ajax提交,因?yàn)閍jax提交是在后臺(tái)執(zhí)行,因
此不可能實(shí)現(xiàn)下載,可以看到這里有form和isUpload兩個(gè)參數(shù):Ext的ajax請求中如果配置了isUpload:true,則其
ajax就不是真正的ajax請求,而是通過創(chuàng)建一個(gè)隱藏的Iframe,并通過form的target指向這個(gè)iframe來提交數(shù)據(jù),并
且發(fā)送的header里將content-type設(shè)為了multipart/form,在JSP中不能成功導(dǎo)出的原因就在這里。這樣的提交方式
其參數(shù)通過request.getParameter是取不到的,當(dāng)然你可以使用上傳組件來獲取,但這樣代碼就變得復(fù)雜。下面
來解決這個(gè)問題,既然這里的Ajax使用是一個(gè)模擬的form提交,那我們其實(shí)可以完全不用。我們直接用form提
交不是更省事嗎?解決辦法如下:創(chuàng)建一個(gè)隱藏form,其target設(shè)置為_blank,然后在其內(nèi)部創(chuàng)建一個(gè)隱藏域存
放xml數(shù)據(jù),然后通過POST方式提交這個(gè)form即可。
實(shí)現(xiàn)代碼:
1
var vExportContent = grid.getExcelXml();
2
if (Ext.isIE6 || Ext.isIE7 || Ext.isSafari || Ext.isSafari2 || Ext.isSafari3)
{
3
var fd=Ext.get('frmDummy');
4
if (!fd)
{
5
fd=Ext.DomHelper.append(Ext.getBody(),
{tag:'form',method:'post',id:'frmDummy',action:'exportexcel.jsp', target:'_blank',name:'frmDummy',cls:'x-hidden',cn:[
6
{tag:'input',name:'exportContent',id:'exportContent',type:'hidden'}
7
]},true);
8
}
9
fd.child('#exportContent').set(
{value:vExportContent});
10
fd.dom.submit();
11
} else
{
12
document.location = 'data:application/vnd.ms-excel;base64,'+Base64.encode(vExportContent);
13
}}
14
JSP代碼:
1
<%
2
response.setHeader("Content-Type","application/force-download");
3
response.setHeader("Content-Type","application/vnd.ms-excel");
4
response.setHeader("Content-Disposition","attachment;filename=export.xls");
5
out.print(request.getParameter("exportContent"));
6
%>
完整代碼下載:grid2excel.rar