当前位置: 代码迷 >> Web前端 >> 解决Ext Grid导出Excel中文乱码有关问题
  详细解决方案

解决Ext Grid导出Excel中文乱码有关问题

热度:103   发布时间:2012-11-08 08:48:11.0
解决Ext Grid导出Excel中文乱码问题
有关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);    
  
%>   
  相关解决方案