美文网首页
springboot使用ExcelBody自定义注解优雅实现Ex

springboot使用ExcelBody自定义注解优雅实现Ex

作者: 蒹葭残辉 | 来源:发表于2020-07-01 23:06 被阅读0次

    我们知道,在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注解,再自定义一个参数解析器呢,答案也是可以的,本人已经实现了,各位如果你也有兴趣赶紧试试吧,祝读者好运!

    相关文章

      网友评论

          本文标题:springboot使用ExcelBody自定义注解优雅实现Ex

          本文链接:https://www.haomeiwen.com/subject/hbykqktx.html