我在使用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的区别