问题
最近遇到一个问题,Excel文件下载,本来是很简单的,结果下载后一直提示下面的信息

搞了两天,查了好多资料,都没解决,最后发现是参数问题,是参数问题
有问题版本
引用
pom文件引用对应jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
实现代码
@GetMapping("/EasyExcel")
public void EasyExcel(@Valid @RequestBody TestTaskInfoSceneQueryReqVo vo ,HttpServletResponse response) throws IOException {
// 1. 生成数据
List<User> users = new ArrayList<>();
users.add(new User(1, "张三", 25, "zhangsan@test.com"));
users.add(new User(2, "李四", 30, "lisi@test.com"));
users.add(new User(3, "王五", 28, "wangwu@test.com"));
response.addHeader("Content-Disposition", "attachment;filename=" + "huyuqiao.xlsx");
response.setContentType("application/vnd.ms-excel;charset=gb2312");
try {
// 从HttpServletResponse中获取OutputStream输出流
ServletOutputStream outputStream = response.getOutputStream();
/*
* EasyExcel 有多个不同的read方法,适用于多种需求
* 这里调用EasyExcel中通过OutputStream流方式输出Excel的write方法
* 它会返回一个ExcelWriterBuilder类型的返回值
* ExcelWriterBuilde中有一个doWrite方法,会输出数据到设置的Sheet中
*/
EasyExcel.write(outputStream, User.class).sheet("测试数据").doWrite(users);
} catch (IOException e) {
e.printStackTrace();
}
}
问题说明
主要问题就是使用了@Valid @RequestBody TestTaskInfoSceneQueryReqVo vo 参数,这个会改变response流,影响下载结果。
可以改为下面的方式。
正常版本
引用
pom引用保持不变
实现代码
@PostMapping("/EasyExcel")
@Operation(summary = "测试任务下载接口")
public void download(@RequestParam(required = false) Integer taskType,
@RequestParam(required = false) String station,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,HttpServletResponse response) throws IOException {
// 1. 生成数据
List<User> users = new ArrayList<>();
users.add(new User(1, "张三", 25, "zhangsan@test.com"));
users.add(new User(2, "李四", 30, "lisi@test.com"));
users.add(new User(3, "王五", 28, "wangwu@test.com"));
response.addHeader("Content-Disposition", "attachment;filename=" + "huyuqiao.xlsx");
response.setContentType("application/vnd.ms-excel;charset=gb2312");
try {
// 从HttpServletResponse中获取OutputStream输出流
ServletOutputStream outputStream = response.getOutputStream();
/*
* EasyExcel 有多个不同的read方法,适用于多种需求
* 这里调用EasyExcel中通过OutputStream流方式输出Excel的write方法
* 它会返回一个ExcelWriterBuilder类型的返回值
* ExcelWriterBuilde中有一个doWrite方法,会输出数据到设置的Sheet中
*/
EasyExcel.write(outputStream, User.class).sheet("测试数据").doWrite(users);
} catch (IOException e) {
e.printStackTrace();
}
}
各位小伙伴有好的方法,可以评论区留言。