解决有关Ext Grid导出Excel在JSP等环境中不可用的问题
有关ExtGrid导出Excel的实现方式,网上已经有很多,官方也给出了一个方案,代码不是很完善,不过已经有高人对这个进行了修正。具体实现方式及代码我这里就不再多说了,大家可以参看:
http://www.dojochina.com/index.php?q=node/1254,附件:gridToExcel.js.txt
其基本思想是:客户端根据Grid数据生成Excel格式的XML数据,然后发送到一个服务端文件,服务端文件通
过设定Content-Type来实现Excel的下载。其中“导出Excel”按钮点击执行的代码如下:
1
if(Ext.isIE6||Ext.isIE7||Ext.isSafari||Ext.isSafari2||Ext.isSafari3)
{2
if(!Ext.fly('frmDummy'))
{3
varfrm=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
}
例子中服务端使用的PHP,这段代码在PHP中可能可以很好的工作,但是如果到了JSP等环境下,就出现了问
题,导出数据可能是空。
问题出在哪里呢?上面这部分代码中的ajax提交其实并不是真正的ajax提交,因为ajax提交是在后台执行,因
此不可能实现下载,可以看到这里有form和isUpload两个参数:Ext的ajax请求中如果配置了isUpload:true,则其
ajax就不是真正的ajax请求,而是通过创建一个隐藏的Iframe,并通过form的target指向这个iframe来提交数据,并
且发送的header里将content-type设为了multipart/form,在JSP中不能成功导出的原因就在这里。这样的提交方式
其参数通过request.getParameter是取不到的,当然你可以使用上传组件来获取,但这样代码就变得复杂。下面
来解决这个问题,既然这里的Ajax使用是一个模拟的form提交,那我们其实可以完全不用。我们直接用form提
交不是更省事吗?解决办法如下:创建一个隐藏form,其target设置为_blank,然后在其内部创建一个隐藏域存
放xml数据,然后通过POST方式提交这个form即可。
实现代码:
1
varvExportContent=grid.getExcelXml();2
if(Ext.isIE6||Ext.isIE7||Ext.isSafari||Ext.isSafari2||Ext.isSafari3)
{3
varfd=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
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
%>