news 2026/5/15 23:40:04

java实现自定义注解导出excel

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java实现自定义注解导出excel

结合Spring AOP (面向切面编程)Alibaba EasyExcel

EasyExcel 是阿里巴巴开源的工具,相比 Apache POI,它极其节省内存(基于流式读写),并且对注解支持非常好。


1. 引入依赖 (Maven)

pom.xml中引入 EasyExcel 和 Spring Boot AOP。

<dependencies><!-- Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- AOP 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- Alibaba EasyExcel (高性能 Excel 工具) --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version><!-- 请检查最新版本 --></dependency><!-- Lombok (简化代码,可选) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>

2. 定义自定义注解@ResponseExcel

创建一个注解,用于标记 Controller 方法,告诉 AOP 这个接口需要导出 Excel。

packagecom.example.demo.annotation;importjava.lang.annotation.*;@Target(ElementType.METHOD)// 作用于方法@Retention(RetentionPolicy.RUNTIME)// 运行时有效@Documentedpublic@interfaceResponseExcel{// 导出的文件名StringfileName()default"data";// Sheet 名称StringsheetName()default"Sheet1";// 导出的实体类类型(用于解析表头)Class<?>clazz();}

3. 定义导出实体类 (Model)

使用 EasyExcel 提供的@ExcelProperty注解来定义表头。

packagecom.example.demo.model;importcom.alibaba.excel.annotation.ExcelIgnore;importcom.alibaba.excel.annotation.ExcelProperty;importcom.alibaba.excel.annotation.write.style.ColumnWidth;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importjava.util.Date;@Data@AllArgsConstructor@NoArgsConstructorpublicclassUserExcelVO{@ExcelProperty("用户ID")@ColumnWidth(20)privateLongid;@ExcelProperty("用户名")@ColumnWidth(30)privateStringusername;@ExcelProperty("年龄")privateIntegerage;@ExcelProperty("注册时间")@ColumnWidth(30)privateDatecreateTime;@ExcelIgnore// 忽略该字段,不导出privateStringpassword;}

4. 实现 AOP 切面处理逻辑 (核心)

这是整个功能的“大脑”。它拦截带有@ResponseExcel的方法,获取返回值(数据列表),然后直接写入 HttpServletResponse 流中。

packagecom.example.demo.aspect;importcom.alibaba.excel.EasyExcel;importcom.example.demo.annotation.ResponseExcel;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.springframework.stereotype.Component;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;importjavax.servlet.http.HttpServletResponse;importjava.net.URLEncoder;importjava.util.List;@Aspect@ComponentpublicclassExcelExportAspect{/** * 环绕通知 * 拦截被 @ResponseExcel 注解的方法 */@Around("@annotation(responseExcel)")publicObjectaround(ProceedingJoinPointpoint,ResponseExcelresponseExcel)throwsThrowable{// 1. 执行目标方法,获取返回的数据列表Objectresult=point.proceed();// 如果返回的不是 List,或者为空,则直接返回原结果(或抛出异常,视业务而定)if(!(resultinstanceofList)){returnresult;}List<?>dataList=(List<?>)result;// 2. 获取 Response 对象ServletRequestAttributesrequestAttributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if(requestAttributes==null){returnnull;}HttpServletResponseresponse=requestAttributes.getResponse();if(response==null){returnnull;}// 3. 设置响应头信息response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 防止中文乱码StringfileName=URLEncoder.encode(responseExcel.fileName(),"UTF-8").replaceAll("\\+","%20");response.setHeader("Content-Disposition","attachment;filename*=utf-8''"+fileName+".xlsx");// 4. 调用 EasyExcel 写入数据到流中try{EasyExcel.write(response.getOutputStream(),responseExcel.clazz()).sheet(responseExcel.sheetName()).doWrite(dataList);}catch(Exceptione){// 导出异常处理,比如重置 response 输出 JSON 错误信息response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().println("{\"code\": 500, \"message\": \"导出Excel失败: "+e.getMessage()+"\"}");}// 5. 返回 null,因为数据已经写入 Response 流,不需要 Spring MVC 再处理返回值returnnull;}}

5. Controller 调用示例

现在,你只需要在 Controller 方法上加上@ResponseExcel即可实现导出,业务逻辑只需返回List

packagecom.example.demo.controller;importcom.example.demo.annotation.ResponseExcel;importcom.example.demo.model.UserExcelVO;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;@RestController@RequestMapping("/excel")publicclassExcelController{/** * 导出用户列表 * 访问地址: http://localhost:8080/excel/export */@GetMapping("/export")@ResponseExcel(fileName="用户列表",sheetName="用户数据",clazz=UserExcelVO.class)publicList<UserExcelVO>exportUsers(){// 模拟查询数据库获取数据List<UserExcelVO>list=newArrayList<>();list.add(newUserExcelVO(1L,"张三",20,newDate(),"123"));list.add(newUserExcelVO(2L,"李四",25,newDate(),"456"));list.add(newUserExcelVO(3L,"王五",30,newDate(),"789"));// 直接返回 List 数据即可,AOP 会自动接管导出逻辑returnlist;}}

注意事项:

  1. 返回类型:被注解的方法必须返回List<T>类型的数据,否则 AOP 可能会抛错或忽略。
  2. JDK 8 兼容性:EasyExcel 和上述代码完全兼容 JDK 8。
  3. 文件名乱码:代码中使用了URLEncoder.encode(..., "UTF-8")并设置了filename*=utf-8'',这是标准的 HTTP 协议写法,能兼容绝大多数现代浏览器下载中文文件不乱码。
  4. 大数据量导出
    • 上面的代码是一次性把 List 加载到内存。如果你要导出 10 万行以上的数据,建议修改 Controller 和 AOP 逻辑,使其支持分页查询写入(doWrite可以多次调用),或者直接在 AOP 中接受Collection。EasyExcel 本身是流式的,只要你不把百万条数据一次性new出来放到 List 里,它就不会 OOM。
  5. 前端联调:前端调用此接口时,需要将responseType设置为blob,否则下载的文件可能是乱码字符串。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 12:14:56

基于SpringBoot的博客系统(毕业设计项目源码+文档)

课题摘要在自媒体内容创作常态化、传统博客平台存在 “内容管理散乱、互动性不足、个性化适配差、数据统计缺失” 的痛点背景下&#xff0c;基于 SpringBoot 的博客系统构建具有重要的用户与运营价值&#xff1a;从创作者层面&#xff0c;系统整合文章编辑&#xff08;富文本 /…

作者头像 李华
网站建设 2026/5/15 12:51:46

java 实现导出excel

方案一&#xff1a;封装通用工具类&#xff08;推荐&#xff09; 这种方式最灵活&#xff0c;可以在 Service 层或者 Controller 层显式地调用导出逻辑。 1. 编写 ExcelUtil 工具类 这个类主要负责&#xff1a;设置浏览器响应头&#xff08;防止中文乱码&#xff09;、创建 Exc…

作者头像 李华
网站建设 2026/5/12 8:58:25

清华镜像助力国产化AI生态:稳定供应TensorFlow等核心框架

清华镜像助力国产化AI生态&#xff1a;稳定供应TensorFlow等核心框架 在当今AI技术加速落地的浪潮中&#xff0c;深度学习框架早已不再是实验室里的“玩具”&#xff0c;而是支撑金融风控、医疗影像、自动驾驶等关键业务系统的工业级引擎。然而&#xff0c;当一个企业或研究团…

作者头像 李华
网站建设 2026/5/14 13:38:32

装配机器人推荐,从技术原理到选型指南,解锁智能制造新动力

在工业4.0浪潮席卷全球的当下&#xff0c;智能制造已成为企业突破产能瓶颈、提升核心竞争力的关键路径。而装配机器人作为智能制造生产线的“核心执行者”&#xff0c;正从汽车制造、3C电子等传统领域&#xff0c;逐步渗透到半导体封装、新能源电池生产、生物医药等高端场景。小…

作者头像 李华
网站建设 2026/5/1 9:21:00

重庆数字化X射线影像DR设备优质品牌哪家好

重庆数字化X射线影像DR设备优质品牌哪家好在医疗领域&#xff0c;数字化X射线影像DR设备的重要性不言而喻。重庆作为医疗设备产业发展的重要地区&#xff0c;有不少品牌的数字化X射线影像DR设备可供选择&#xff0c;其中重庆东恩科技有限公司表现十分亮眼。强大的自主研发实力东…

作者头像 李华
网站建设 2026/5/12 22:39:34

全面整理15款文档生成PPT工具,PDF转PPT不再难

告别文档转PPT难题&#xff01;轻竹办公让转换轻松高效在职场中&#xff0c;我们常常会遇到这样的场景&#xff1a;辛辛苦苦撰写好的文档&#xff0c;要转换成PPT用于年终总结、项目汇报等重要场合。然而&#xff0c;这个过程却充满了各种痛点。有的人熬夜修改PPT&#xff0c;内…

作者头像 李华