news 2026/4/18 11:07:35

Spring Boot 项目使用 EasyExcel 实现导出功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 项目使用 EasyExcel 实现导出功能

你想要在 Spring Boot 项目中基于 EasyExcel 完整实现 Excel 导出功能,我会为你梳理一套标准化、可直接落地的实现方案,包含基础导出、字段控制、异常处理等核心内容,确保功能健壮且符合开发规范。
一、完整实现步骤

  1. 环境准备(引入依赖)
    在 pom.xml 中添加 EasyExcel 核心依赖(已兼容 Spring Boot 2.x/3.x):
<!-- EasyExcel 核心依赖 --><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><!-- Web 依赖(Spring Boot 基础,若已引入可忽略) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
  1. 定义导出实体类(控制导出字段)
    创建与 Excel 列映射的实体类,通过注解控制哪些字段导出、哪些忽略:
importcom.alibaba.excel.annotation.ExcelIgnore;importcom.alibaba.excel.annotation.ExcelProperty;importlombok.Data;/** * 导出实体类:用户信息 * 注解说明: * - @ExcelProperty:标注需要导出的字段,指定列名和列顺序 * - @ExcelIgnore:标注需要忽略的字段(不导出) */@DatapublicclassUserExportVO{// 导出:用户ID(第0列)@ExcelProperty(value="用户ID",index=0)privateLongid;// 导出:用户名(第1列)@ExcelProperty(value="用户名",index=1)privateStringusername;// 导出:用户状态(第2列)@ExcelProperty(value="用户状态",index=2)privateStringstatus;// 忽略:密码(不导出)@ExcelIgnoreprivateStringpassword;// 忽略:创建人(不导出)@ExcelIgnoreprivateStringcreateBy;}
  1. 编写业务层(模拟数据查询)
    模拟从数据库查询导出数据(实际项目替换为真实 DAO/MyBatis 查询):
importorg.springframework.stereotype.Service;importjava.util.ArrayList;importjava.util.List;@ServicepublicclassUserExportService{/** * 查询待导出的用户数据 * @return 导出数据列表 */publicList<UserExportVO>listExportData(){// 模拟数据库查询结果(实际项目替换为真实查询逻辑)List<UserExportVO>dataList=newArrayList<>();UserExportVOuser1=newUserExportVO();user1.setId(1L);user1.setUsername("张三");user1.setStatus("正常");user1.setPassword("123456");// 该字段会被忽略,不导出UserExportVOuser2=newUserExportVO();user2.setId(2L);user2.setUsername("李四");user2.setStatus("禁用");user2.setCreateBy("admin");// 该字段会被忽略,不导出dataList.add(user1);dataList.add(user2);returndataList;}}
  1. 编写导出接口(核心)
    通过 HttpServletResponse 将 Excel 流直接返回给前端,实现文件下载:
importcom.alibaba.excel.EasyExcel;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletResponse;importjava.net.URLEncoder;@RestController@RequestMapping("/api/export")publicclassExportController{@ResourceprivateUserExportServiceuserExportService;/** * 导出用户列表为 Excel 文件 * @param response 响应对象,用于输出 Excel 流 */@GetMapping("/user")publicvoidexportUserExcel(HttpServletResponseresponse){try{// 1. 设置响应头:告诉浏览器返回的是 Excel 文件,解决中文文件名乱码response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("UTF-8");// 文件名编码处理(兼容各浏览器)StringfileName=URLEncoder.encode("用户列表_"+System.currentTimeMillis(),"UTF-8").replaceAll("\\+","%20");response.setHeader("Content-Disposition","attachment;filename*=utf-8''"+fileName+".xlsx");// 2. 查询导出数据List<UserExportVO>exportData=userExportService.listExportData();// 3. 写入 Excel 并通过响应流返回EasyExcel.write(response.getOutputStream(),UserExportVO.class).sheet("用户数据")// Excel 工作表名称.doWrite(exportData);// 写入数据}catch(Exceptione){// 异常处理:返回友好提示(实际项目建议用全局异常处理器)response.reset();response.setContentType("application/json");response.setCharacterEncoding("UTF-8");try{response.getWriter().write("{\"code\":500,\"msg\":\"导出失败:"+e.getMessage()+"\"}");}catch(Exceptionex){ex.printStackTrace();}}}}
  1. 全局异常处理(可选,优化体验)
    创建全局异常处理器,统一处理导出过程中的异常:
importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@RestControllerAdvicepublicclassExportExceptionHandler{/** * 处理导出相关异常 */@ExceptionHandler(Exception.class)publicvoidhandleExportException(HttpServletResponseresponse,Exceptione)throwsIOException{response.reset();response.setContentType("application/json");response.setCharacterEncoding("UTF-8");response.getWriter().write("{\"code\":500,\"msg\":\"Excel 导出失败:"+e.getMessage()+"\"}");}}

二、测试导出功能
启动 Spring Boot 项目;
访问接口:http://localhost:8080/api/export/user;
浏览器会自动下载名为「用户列表_时间戳.xlsx」的文件;
打开文件,仅包含「用户 ID」「用户名」「用户状态」3 列,password 和 createBy 字段未导出。
三、进阶优化(可选)

  1. 大数据量导出(避免内存溢出)
    若导出数据量超过 1 万条,使用「分批查询 + 数据监听器」:
// 替换 Controller 中的写入逻辑EasyExcel.write(response.getOutputStream(),UserExportVO.class).sheet("用户数据").doWrite(()->{// 分批查询数据(示例:每次查1000条)returnuserExportService.listExportDataByPage(1,1000);});
  1. 自定义 Excel 样式(表头 / 内容)
// 自定义样式示例WriteCellStyleheadStyle=newWriteCellStyle();headStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());// 表头背景色WriteFontheadFont=newWriteFont();headFont.setFontName("微软雅黑");headFont.setFontHeightInPoints((short)12);headStyle.setWriteFont(headFont);// 写入时指定样式EasyExcel.write(response.getOutputStream(),UserExportVO.class).registerWriteHandler(newHorizontalCellStyleStrategy(headStyle,newWriteCellStyle())).sheet("用户数据").doWrite(exportData);

总结
EasyExcel 实现导出的核心是:实体类注解映射列 + 响应流输出文件,未标注 @ExcelProperty 或标注 @ExcelIgnore 的字段会被忽略;
关键配置:必须设置正确的响应头(Content-Type/Content-Disposition),解决文件类型识别和中文文件名乱码问题;
健壮性优化:添加异常处理避免接口报错,大数据量场景需分批查询写入,防止内存溢出。
以上代码可直接复制到项目中,替换 UserExportService 中的模拟数据为真实业务查询,即可快速实现生产级的 Excel 导出功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 6:48:17

【计算机毕业设计案例】基于springboot的个人健康管理系统基于springboot个人健康档案管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 9:45:00

【Docker】解决Docker容器时间与宿主机时间不一致的几种方法

一、介绍 由于Docker容器内的时间默认是 UTC 世界标准时间&#xff0c;而宿主机时间为 CST 中国标准时间&#xff08;东八区&#xff0c;Asia/Shanghai&#xff09;&#xff0c;时间相差8小时&#xff0c;根本原因是时区问题。因此&#xff0c;需要为Docker容器配置正确的时区&…

作者头像 李华
网站建设 2026/4/18 3:24:58

直播美颜SDK怎么选?从人脸美型效果、性能与成本全面分析

在直播行业卷到“美颜都快成标配”的今天&#xff0c;不管你是做直播平台、社交产品&#xff0c;还是短视频、电商直播&#xff0c;选对一款直播美颜SDK&#xff0c;往往直接影响用户留存率和产品口碑。 问题是&#xff1a; 市面上的直播美颜SDK这么多&#xff0c;看起来功能都…

作者头像 李华
网站建设 2026/4/18 8:41:28

嵌入式系统设计师软考个人笔记<3>

1.1 嵌入式系统电源管理1.1.1 电源系统基础定义&#xff1a;为嵌入式设备提供稳定、合规直流电能的子系统&#xff0c;通常将交流市电或电池电源转换为系统所需的直流电压等级。供电类型&#xff1a;市电供电&#xff1a;通过AC-DC转换模块&#xff08;如开关电源&#xff09;提…

作者头像 李华
网站建设 2026/4/18 10:49:52

解码内部集成电路(IIC)与OLED屏

内部集成电路&#xff08;IIC/I2C&#xff09; 基本概念 英文全称Inter Integrated Circuit&#xff0c;简称IIC或I2C&#xff0c;是半双工同步串行通信接口协议1982年由飞利浦公司&#xff08;现恩智浦半导体&#xff09;设计推出设计初衷&#xff1a;为微控制器&#xff08;…

作者头像 李华
网站建设 2026/4/17 8:42:33

稳定细胞系构建 | 稳定株开发服务 | 高表达克隆筛选

稳定细胞系构建是细胞生物学、分子生物学和蛋白质工程等众多科研领域中广泛采用的一项基础技术。所谓稳定细胞系&#xff0c;是指通过遗传整合外源基因的方式&#xff0c;使细胞在长期传代过程中持续稳定表达目标蛋白&#xff08;或其它功能元件&#xff09;的细胞系。这类细胞…

作者头像 李华