tangtb

Hadoop,SpringMVC,ExtJs,Struts2,Spring,SpringSecurity,Hibernate,Struts
posts - 25, comments - 88, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

                                         解决有关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”按钮点击执行的代码如下:

 1if (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}

例子中服务端使用的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即可。

实现代码:

 1var vExportContent = grid.getExcelXml(); 
 2if (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<%  
2response.setHeader("Content-Type","application/force-download"); 
3response.setHeader("Content-Type","application/vnd.ms-excel"); 
4response.setHeader("Content-Disposition","attachment;filename=export.xls"); 
5out.print(request.getParameter("exportContent")); 
6%>


 完整代码下载:grid2excel.rar


评论

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题  回复  更多评论   

2009-03-25 18:29 by e不
我在ASP环境下
报错
《%
Response.AddHeader "ContentType", "application/force-download"
Response.AddHeader "ContentType", "application/vnd.ms-excel"
Response.AddHeader "Content-Disposition","attachment;filename=export.xls"
Response.Write Request.Form("exportContent")
%>

QQ:106716940

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题[未登录]  回复  更多评论   

2009-05-22 11:26 by 111
你相当厉害了 恭喜啊

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题  回复  更多评论   

2009-07-09 15:21 by ext
分页的就用不了。。。。。。。
如果可以解决。。
请加下我qq:32963797

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题[未登录]  回复  更多评论   

2010-01-15 23:46 by Lee
好厲害! thx

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题  回复  更多评论   

2012-02-28 17:36 by 麟崖
你好,我在firefox测试可以使用,IE8下面无法正常使用,添加"Ext.IE8||"后产生的xls文件为空,请问是否知道是什么原因产生的呢

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题  回复  更多评论   

2012-02-28 18:54 by 麟崖
谢谢,我已经解决了,是JSP的问题

# re: 【转载】解决有关Ext Grid导出Excel在JSP等环境中不可用的问题[未登录]  回复  更多评论   

2012-04-17 13:24 by abc
@麟崖
ie8下不能导出你怎么解决的

只有注册用户登录后才能发表评论。


网站导航: