springboot使用ExcelBody自定义注解优雅实现Excel导出

我们知道,在springmvc中,我们使用ResponseBody注解修饰在Controller方法上,就可以直接将返回值转化为json返回在页面。

于是乎,作者受到了这点启发,能不能也有个ExcelBody注解,直接将Controller层方法返回成一个Excel文件内容导出呢,于是着手实现,我们希望在Controller层写如下代码,即可实现Excel导出。最终效果:

@RestController
public class StudentController{
       
      @GetMapping("export")
      @ExcelBody
      public List 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 {
    @Override
    public boolean supports(MethodParameter methodParameter, Class> aClass) {
        return methodParameter.getMethodAnnotation(ExcelBody.class)!=null;
    }

    @Override
    public List beforeBodyWrite(List retVal, MethodParameter methodParameter, MediaType mediaType, Class> 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注解,再自定义一个参数解析器呢,答案也是可以的,本人已经实现了,各位如果你也有兴趣赶紧试试吧,祝读者好运!

你可能感兴趣的:(springboot使用ExcelBody自定义注解优雅实现Excel导出)