有关ExtGrid导出Excel的实现方式,网上已经有很多,官方也给出了一个方案,代码不是很完善,不过已经有高人对这个进行了修正。具体实现方式及代码我这里就不再多说了,大家可以参看:http://www.dojochina.com/index.php?q=node/1254,附件:gridToExcel.js。其基本思想是:客户端根据Grid数据生成Excel格式的XML数据,然后发送到一个服务端文件,服务端文件通过设定Content-Type来实现Excel的下载。
例子中服务端使用的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即可。
var exportExcel = function(gridId,title,fileName){
var grid = Ext.getCmp(gridId);
var vExportContent = grid.getExcelXml(title);
//alert(vExportContent);
if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8 || Ext.isSafari || Ext.isSafari2 || Ext.isSafari3) {
var fd=Ext.get('frmDummy');
if (!fd) {
fd=Ext.DomHelper.append(Ext.getBody(),{tag:'form',method:'post',id:'frmDummy',action:exportExcelUrl, target:'_blank',name:'frmDummy',cls:'x-hidden',cn:[
{tag:'input',name:'fileName',id:'fileName',type:'hidden'},
{tag:'input',name:'exportContent',id:'exportContent',type:'hidden'}
]},true);
}
fd.child('#fileName').set({value:fileName});
fd.child('#exportContent').set({value:vExportContent});
fd.dom.submit();
} else {
document.location = 'data:application/vnd.ms-excel;base64,'+Base64.encode(vExportContent);
}}
其中参数gridId为GridPanel的id,title为excel的sheet标题,fileName导出的excel文件名称。
导出的jsp如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%
String content = request.getParameter("exportContent");
String fileName = request.getParameter("fileName");
content = new String(content.getBytes("ISO8859_1"));
response.setHeader("Content-Type","application/force-download");
response.setHeader("Content-Type","application/vnd.ms-excel");
response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");
out.print(content);
%>
网上流传的很多版本在ie7、ie8中导出中文是乱码,需要在jsp文件中加上 <%@ page language="java" pageEncoding="UTF-8"%>头,获取的内容需要进行转码:
content = new String(content.getBytes("ISO8859_1"));
这样在ie7、ie8、Firefox中都可以导出中文。
但上面的版本只支持Windows操作系统,不支持Aix和Unix操作系统。下面给一个支持Aix操作系统的版本,我们只需要修改一下jsp即可:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import= "java.net.URLEncoder "%>
<%
request.setCharacterEncoding("GBK");
String content = request.getParameter("exportContent");
String fileName = request.getParameter("fileName");
String os = System.getProperty("os.name");
if(os.contains("Windows")){
content = new String(content.getBytes("ISO8859_1"));//WINDOWS 下需要进行转码,AIX下不需要转码
}else if(os.contains("AIX")){
fileName = java.net.URLEncoder.encode(fileName,"UTF-8");//WINDOWS 下不需要对文件名进行转码,AIX下需要转码
}
response.setHeader("Content-Type","application/force-download");
response.setHeader("Content-Type","application/vnd.ms-excel");
response.setHeader("Content-Disposition","attachment;filename=" + fileName + ".xls");
out.print(content);
%>