解决有关Ext Grid导出Excel在JSP等环境中不可用的问题

http://www.ajaxbbs.net/post/extjs/10.html

 

 

有关ExtGrid导出Excel的实现方式,网上已经有很多,官方也给出了一个方案,代码不是很完善,不过已经有高人对这个进行了修正。具体实现方式及代码我这里就不再多说了,大家可以参看: http://www.dojochina.com/index.php?q=node/1254 ,附件: gridToExcel.js.txt

其基本思想是: 客户端根据Grid数据生成Excel格式的XML数据,然后发送到一个服务端文件,服务端文件通过设定Content-Type来实现Excel的下载。

其中“导出Excel”按钮点击执行的代码如下:

var
 vExportContent = grid.getExcelXml(); 
if  (Ext.isIE6 || Ext.isIE7 || Ext.isSafari || Ext.isSafari2 || Ext.isSafari3) { 
    if  (! Ext.fly('frmDummy' )) { 
        var  frm = document .createElement('form' ); 
        frm.id = 'frmDummy'
        frm.name = id; 
        frm.className = 'x-hidden'
        document .body.appendChild(frm); 
    } 
    Ext.Ajax.request({ 
        url: '/exportexcel.php'
        method: 'POST'
        form: Ext.fly('frmDummy' ), 
        callback: function (o, s, r) { 
            //alert(r.responseText);  
        }, 
        isUpload true
        params: {exportContent: vExportContent} 
    }) 
else  { 
    document .location = 'data:application/vnd.ms-excel;base64,'  + Base64.encode(vExportContent); 

例子中服务端使用的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
 vExportContent = grid.getExcelXml(); 
if  (Ext.isIE6 || Ext.isIE7 || 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:'exportexcel.jsp' , target:'_blank' ,name:'frmDummy' ,cls:'x-hidden' ,cn:[ 
            {tag:'input' ,name:'exportContent' ,id:'exportContent' ,type:'hidden'
        ]},true ); 
    } 
    fd.child('#exportContent' ).set({value:vExportContent}); 
    fd.dom.submit (); 
else  { 
    document .location = 'data:application/vnd.ms-excel;base64,' +Base64.encode(vExportContent); 
}} 
JSP代码:
<%  
response.setHeader("Content-Type" ,"application/force-download" ); 
response.setHeader("Content-Type" ,"application/vnd.ms-excel" ); 
response.setHeader("Content-Disposition" ,"attachment;filename=export.xls" ); 
out.print(request.getParameter("exportContent" )); 
%>  
完整代码下载: grid2excel.rar
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用ExtJS 4.2.1的完整例子,可以将Grid表格导出Excel文件: ``` Ext.require([ 'Ext.grid.*', 'Ext.data.*', 'Ext.util.*', 'Ext.toolbar.Paging', 'Ext.ux.exporter.Exporter' ]); Ext.onReady(function() { // 模拟数据 var data = []; for (var i = 0; i < 20; i++) { data.push({ name: 'User ' + i, email: 'user' + i + '@example.com', phone: '555-' + Ext.Number.randomInt(1000, 9999) }); } // 创建数据模型 Ext.define('User', { extend: 'Ext.data.Model', fields: ['name', 'email', 'phone'] }); // 创建数据源 var store = Ext.create('Ext.data.Store', { model: 'User', data: data, proxy: { type: 'memory', reader: { type: 'json', root: 'data' } } }); // 创建Grid表格 var grid = Ext.create('Ext.grid.Panel', { store: store, columns: [{ text: 'Name', dataIndex: 'name' }, { text: 'Email', dataIndex: 'email', flex: 1 }, { text: 'Phone', dataIndex: 'phone' }], width: 400, height: 200, dockedItems: [{ xtype: 'toolbar', dock: 'top', items: [{ xtype: 'button', text: 'Export to Excel', handler: function() { // 导出Excel Ext.ux.exporter.Exporter.exportGrid(grid, 'Excel', { title: 'User List' }); } }] }, { xtype: 'pagingtoolbar', store: store, dock: 'bottom', displayInfo: true }] }); // 渲染Grid表格 Ext.create('Ext.container.Viewport', { layout: 'fit', items: [grid] }); }); ``` 在上面的代码,我们首先定义了一个模拟数据数组,然后创建了一个数据模型和一个数据源。接下来,我们创建了一个Grid表格,将数据源绑定到该表格,并添加了一个工具栏和一个分页工具栏。在工具栏,我们添加了一个按钮,当用户单击该按钮时,将调用Ext.ux.exporter.Exporter.exportGrid函数将Grid表格导出Excel文件。 需要注意的是,我们使用Ext.ux.exporter.Exporter类来执行导出操作。该类是ExtJS的一个扩展,需要在应用程序明确声明。在本例,我们使用Ext.require函数来加载必需的类和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值