ajax请求下载Execl表

Execl表是经常要用到的存放二位数据的表格,Java也可以直接操作Execl表,经常用到的方式就是jxl和poi。

在这次项目中,我用到的poi往Execl中写数据,刚开始设计的是前端发送一个ajax请求,后端响应后再浏览器下载Execl表。

function exportGjOil(){
        $.ajax({
            type: 'post',
            url: '/sysUser/selectAuditType',
            data: {
                id:[[${id}]],
            },
            dataType: 'json',
            success: function (data) {
                if(data==2 ||data==4){
                    $.ajax({
                        type: 'get',
              //向后台发送请求,后台往execl中写数据,并以流的形式返回前端 url:
'/materialGjOilDetail/downloadEcexl', data: { year:[[${year}]], companyId:[[${companyId}]] }, // dataType: 'json', success: function (data) { $.infoMsg("文件已下载至D:\校验结果"); }, error: function (data) { $.infoMsg("下载失败,请重新下载"); } }); //window.location.href = "/materialGjOilDetail/downloadEcexl?year="+[[${year}]]+"&companyId"+[[${companyId}]]; } else{ $.infoMsg("该公司没有燃油公交车辆信息"); } } });

以上代码是最开始的设计思路,可是每次请求返回后,浏览器控制台的response都是乱码,这是因为ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的,JQuery的ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,。文件的下载是以二进制形式进行的,所以ajax无法处理二进制流的response来下载文件。所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载。

最后将ajax的请求改为用<a>标签来实现就可以了。或者用window.location.href="URL"也可以。如果一定要用ajax,可以用就是生成一个form,用这个form提交参数,并返回“流”类型的数据。

 

posted @ 2018-12-12 09:24 飘逸黄金甲 阅读(...) 评论(...) 编辑 收藏