关于使用EasyExcel路径传值以及无法下载的问题

我在使用EasyExcel做批量导出功能的时遇到了以下两个问题

1.响应成功了,后端的sql日志也显示查询了数据,但是页面没有下载Excel文件

onClick:function (){
            //获取列表选中
            var checkedList = $("#datagrid_User").datagrid('getChecked');
            //判断是否列表中是否有选中
            if(checkedList.length==0){
              $.messager.show({
                title:"提示",
                msg:"请至少选中一个你想要删除的对象",
              });
            }
            if(!confirm("确认是否删除?")){
                return;
            }
            //获取列表选中集合
           let ids=[];
           for(var i=0;i<checkedList.length;i++){
             ids.push(checkedList[i].id);
           }
            //ajax操作    将ids返回后端
           $.ajax({
             url:"http://localhost:8080/User/deleteUser",
             type:"POST",
             contentType: "application/json",
             data:JSON.stringify(ids),
             success:function (){
                $("#datagrid_User").datagrid("reload");
             }
           });
          }

之前我使用的是类似的代码,(框架是用的很老的EasyUI框架),主要流程是获取选中用户,将选中用户的id放到一个数组,再通过ajax方式返回给后端进行处理,但是使用EasyExcel就会出现问题,原因是  发送Ajax请求后,后端响应的是二进制数据,jQuery的Ajax只能接收JSON等数据。(我也是从其他地方看来的)。所有只能使用其他方式。

onClick:function (){
            var item = $("#datagrid_User").datagrid("getChecked");
            if(item.length==0){
              $.messager.show({
                title:"提示",
                msg:"请至少选择一个你想要导出的对象",
              });
            }
            else {
                let ids=[];
                for (var i=0;i<item.length;i++){
                  ids.push(item[i].id);
                }
               //与上图不同的地方,使用拼接url的方式,但是后端依旧接收不了
              var downloadUrl = 'http://localhost:8080/User/exportUser/'+ids.join(',');
              window.location.href = downloadUrl;
            }
          }

就是通过访问超链接,用路径传值的方式将ids这个装着选中对象的数组,传递给后端。但是这里我又出现了问题。这里的downloadUrl拼接之后的路径是http://localhost:8080/User/exportUser/1,2,3  这种形式,但是我一开始找到的拼接方式是这样的。

var downloadUrl = 'http://localhost:8080/users/batchexport?ids=' + selectedIds.join(',');

路径是http://localhost:8080/User/exportUser?ids=1,2,3

@GetMapping("exportUser")
    //使用@RequestBody接收不了   ?ids=1,2,3的数据
    public void exportUserError(HttpServletResponse response,@RequestBody List<Long> ids)

所有我之前controller层里面的函数一直是这样的形式,我将@RequestBody改成@RequestParam也不行,我属于是学艺不精了。

最后我也总结一下这个问题的解决办法 (有可能有点啰嗦了)

1.首先是EasyExcel还是依赖jQuery的,后端相应的数据是二进制的,但是jQuery只能接受JSon数据,所以前端我们使用访问超链接的方式。

 onClick:function (){
            var item = $("#datagrid_User").datagrid("getChecked");
            if(item.length==0){
              $.messager.show({
                title:"提示",
                msg:"请至少选择一个你想要导出的对象",
              });
            }
            else {
                let ids=[];
                for (var i=0;i<item.length;i++){
                  ids.push(item[i].id);
                }
               //这里修改为  exportUser/1,2,3的形式,后端改用@PathVariable接收,同时
                @GetMapping中一定要修改   !!  exportUser/{ids}   !!
              var downloadUrl = 'http://localhost:8080/User/exportUser/'+ids.join(',');
              window.location.href = downloadUrl;
            }
          }

2.其次是路由传值 后端接收的问题,我这里使用的是http://localhost:8080/User/exportUser/1,2,3这种形式,所以前端要接收的话需要改成下面那种形式,路径接收。

@GetMapping("exportUser/{ids}")
    public void exportUser(HttpServletResponse response,@PathVariable List<Long> ids)

最后我去查一下@RequestBody和RequestParam的区别

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值