我们知道,在springmvc中,我们使用ResponseBody注解修饰在Controller方法上,就可以直接将返回值转化为json返回在页面。
于是乎,作者受到了这点启发,能不能也有个ExcelBody注解,直接将Controller层方法返回成一个Excel文件内容导出呢,于是着手实现,我们希望在Controller层写如下代码,即可实现Excel导出。最终效果:
@RestController
public class StudentController{
@GetMapping("export")
@ExcelBody
public List<Student> exportStudents(){
return studentService.selectAll();
}
}
我们希望在访问上面接口的时候,即可实现Excel导出。
具体实现逻辑:
编写ExcelBody注解:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelBody {
}
实现ResponseBodyAdvice,对ExcelBody注解的Controller层方法做单独处理。
这里我们使用的是easyExcel导出excel,当然,你也可以使用其他技术导出。
@ControllerAdvice
public class ExcelResponseBodyAdvice implements ResponseBodyAdvice<List> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return methodParameter.getMethodAnnotation(ExcelBody.class)!=null;
}
@Override
public List beforeBodyWrite(List retVal, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse response) {
if(CollectionUtils.isEmpty(retVal)){
return null;
}
//设置response的Header
response.getHeaders().add("Content-Disposition", "attachment;filename=学生列表.xlsx");
response.getHeaders().add("Content-Type","application/msexcel;charset=UTF-8");
try {
EasyExcel.write(response.getBody(), retVal.get(0).getClass())
.sheet("学生列表")
.doWrite(retVal);
response.getBody().flush();
} catch (IOException e) {
throw new MmsException("io流处理异常!",e);
}
return null;
}
}
最后附上学生类:
@Data
public class Student{
@ExcelProperty(value = "学生id",index = 0)
private Integer id;
@ExcelProperty(value = "学生姓名",index = 1)
private String name;
@ExcelProperty(value = "学生年龄",index = 2)
private Integer age;
}
最后浏览器 访问对应接口,即可实现excel文件导出。
最后再提一个建议,如果是excel文件上传,我们是不是也可以自定义一个ExcelRequestBody注解,再自定义一个参数解析器呢,答案也是可以的,本人已经实现了,各位如果你也有兴趣赶紧试试吧,祝读者好运!