Springboot+vue项目导出文件controller层代码:
@RestController //可以返回JSON和视图 @Controller只能返回视图 @ResponseBody只能返回JSON
@RequestMapping("/user")
public class UserController {
//导出接口
@GetMapping("/export")
public boolean export(HttpServletResponse response) throws Exception {
//从数据库查出所有数据
List<User> list = userService.list();
// ExcelWriter excelWriter = ExcelUtil.getWriter("diskpath");//直接写到磁盘路径
//写出到浏览器
ExcelWriter excelWriter = ExcelUtil.getWriter(true);
// 自定义标题别名
excelWriter.addHeaderAlias("id", "ID");
excelWriter.addHeaderAlias("username", "用户名");
excelWriter.addHeaderAlias("nickname", "昵称");
excelWriter.addHeaderAlias("password", "密码");
excelWriter.addHeaderAlias("address", "地址");
excelWriter.addHeaderAlias("phone", "电话");
excelWriter.addHeaderAlias("email", "邮箱");
excelWriter.addHeaderAlias("createTime", "创建时间");
excelWriter.addHeaderAlias("avatarUrl", "头像");
// 一次性写出list内的所有对象到excel,使用默认样式,强制输出标题
excelWriter.write(list, true);
// 设置浏览器响应的格式
// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
// String fileName = URLEncoder.encode("用户信息", StandardCharsets.UTF_8);
// response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
String fileName = URLEncoder.encode("用户信息", "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
// 获取并绑定输出流
ServletOutputStream outputStream = response.getOutputStream();
excelWriter.flush(outputStream, true);
//关闭流对象和ExcelWriter对象
outputStream.close();
excelWriter.close();
return true;
}
}
报错信息:
2022-02-28 20:37:53.026 WARN 71664 --- [nio-9090-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
[nio-9090-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.lang.Boolean] with preset Content-Type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'] with root cause
org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.lang.Boolean] with preset Content-Type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
说是response请求关闭后服务器端就不能在用了,最后发现是函数返回值的原因,如图函数export的返回值应该是void,不应该是boolean
response请求关闭后,函数的返回值信息已经无法通过response传达给前端接口了