后端采用springboot+poi,在postman中测试接口是可以进行excel下载的。
@PostMapping("/out")
public Object outExcelDemo(HttpServletResponse response) throws IOException, IllegalAccessException {
//文件名
String fileName = "活动报名情况一览表";
//sheet名
String sheetName = "报名情况sheet";
//表头集合,作为表头参数
List<String> titleList = new ArrayList<>();
titleList.add("用户账户");
titleList.add("用户名");
titleList.add("报名时间");
titleList.add("是否完成");
List<String> l1 = new ArrayList<>();
l1.add("1h");
l1.add("1h");
l1.add("1");
l1.add("1");
List<String> l2 = new ArrayList<>();
l2.add("2");
l2.add("2");
l2.add("2h");
l2.add("2h");
ArrayList<List<String>> list = new ArrayList<>();
list.add(l1);
list.add(l2);
//调取封装的方法,传入相应的参数
XSSFWorkbook workbook = ExcelUtil.createExcel(sheetName, titleList, list);
//输出Excel文件
OutputStream output = response.getOutputStream();
// response.reset();
//中文名称要进行编码处理
response
.setHeader("Content-Disposition", "attachment; filename=demo.xlsx");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
workbook.write(output);
output.close();
return null;
}
但是在前端进行接收下载的时候浏览器就会一直爆红。
const downloadExcel = () => {
request({
url: '/demo/out',
method: 'POST',
responseType: 'arraybuffer', // 指定响应类型为二进制数据
// responseType: 'blob', // 指定响应类型为二进制数据
})
.then((response) => {
// const blob = new Blob([response.data], {
// type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
// })
// const url = window.URL.createObjectURL(blob)
// const link = document.createElement('a')
// link.href = url
// link.setAttribute('download', 'demo4.xlsx') // 指定下载的文件名
// document.body.appendChild(link)
// link.click()
// 释放URL对象
// window.URL.revokeObjectURL(url)
console.log(response.data)
})
.catch(function (error) {
console.error('Excel生成失败', error)
})
}
具体爆红是这样的,responseType: 'blob'也不行