天天看点

Excel导出异常及href链接传参乱码问题

这是本人写的第一篇博客,不足之处忘大家指正,相互学习。

写这篇博客的目的是因为在做excel导出功能时遇到两个问题,第一个问题是用链接发送url至后台执行导出功能时,链接中传输的中文出现乱码,但是后台并不能友好的解决中文参数乱码问题,第二个问题是改为ajax传参,后台程序虽然执行,但excel并不能导出,后期通过jq的一个方法解决了这两个问题。接下来分享我处理的过程及最后的解决方法。

1.编写之初使用链接加参数传送到后台执行导出功能

<script type="text/javascript">
    function exportExcel() {
        var stuNo=$("#stuNo").val();
        var stuName=$("#stuName").val();
        location.href = "${ctx}/gsapply/gsApply/exportExcel?stuNo="+stuNo
        + "&stuName="+stuName;
    }
</script>
           

但是后台获取传送的参数出现问题,参数是一堆看不懂的&等英文,并不能转码,试了好几种方法,也解决不了乱码问题。

2.改为ajax传参数,是为了解决参数乱码问题

<script type="text/javascript">
    function exportExcel() {
        var stuNo=$("#stuNo").val();
        var stuName=$("#stuName").val();
            $.ajax({
                type : "POST",
                url : "${ctx}/gsapply/gsApply/exportExcel",
                dataType : "json",
                data : {
                    "stuNo" : stuNo,
                    "stuName":stuName
                }
        })
    }
</script>
           

这样能获取参数,中文也不会出现乱码,但是执行导出功能时,后台程序执行了,前台并没有执行导出功能,就是excel表格并没有导出,请看下面的导出代码块

@ResponseBody
@RequestMapping(value = "exportExcel")
    public String exportExcel(GsApply gsApply,HttpServletRequest request, 
                HttpServletResponse response,
                RedirectAttributes redirectAttributes) {
            try {
                String fileName =  DateUtils.getDate("yyyy_MM_dd_")+"资助详情列表" + ".xlsx";

                //返回需要导出的列表
                List<GsExportExcel> excelList=gsApplyService.ExportList(gsApply);
                new ExportExcel("资助详情信息",GsExportExcel.class).setDataList(excelList).write(response, fileName)
                        .dispose();
                return null;
            } catch (Exception e) {
                e.printStackTrace();
            }
           

执行到图中代码块时,前台并没有实现导出功能,代码也是正确的。

Excel导出异常及href链接传参乱码问题

3.解决问题及原因

每个公司总会有前辈教你一些东西,我这有个前辈知道的多,他给了我一个jq方法,完美的解决了传参和导出excel异常问题,请看下面代码块。

<script type="text/javascript">
    function exportExcel() {
        var exportUrl= "${ctx}/gsapply/gsApply/exportExcel";
        download(exportUrl,decodeURIComponent($("#searchForm").serialize()),"post");
        function download(url, data, method){ 
            // 获取url和data 
            if( url && data ){ 
                // data 是 string 或者 array/object 
                data = typeof data == 'string' ? data : jQuery.param(data); 
                // 把参数组装成 form的 input 
                var inputs = ''; 
                jQuery.each(data.split('&'), function(){ 
                    var pair = this.split('='); 
                    inputs+='<input type="hidden" name="'+ pair[] +'" value="'+ pair[] +'" />'; 
                }); 
                // request发送请求 
            jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>') 
                .appendTo('body').submit().remove(); 
            }; 
        };
    }
</script>
           

此方法主要是获取表单的参数,同时给予一个链接地址,并提交至后台,代码的目的是自己解析form中的参数,并生成独立的form表单,提交参数至后台后,同时又删除了自我生成的from.前面提到的ajax传参导致导出功能无法执行,是因为ajax传参导致excel导出功能的流丢失了,所以界面无法找到原来的流,匹配不上自然功能就无法执行。

Excel导出异常及href链接传参乱码问题

看图中的红框,执行此方法只需要给予发送地址,加上需要获取参数的from表单的id即可,from中name等于的值就是你要传送至后台的参数对应的名字,此表单name属性值一定要与你想传递到后台的参数的那么值对应。

总结:此方法能解决很多传参问题及一些导出,下载过程中流丢失问题,是个很好的方法。这个方法主要是将表单先进行序列化再重新组成独立的form,获取参数并传递链接后,又自我删除,对原来的表单没有影响。

最后,很感谢每一位读者的浏览,谢谢!