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 导出功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1220722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人群仿真软件:Vadere_(11).Vadere与其他仿真软件的比较

Vadere与其他仿真软件的比较 在人群仿真软件领域&#xff0c;Vadere并不是唯一的选择。了解Vadere与其他仿真软件的差异和优势&#xff0c;可以帮助用户更好地选择适合自己需求的工具。本节将重点比较Vadere与其他流行的仿真软件&#xff0c;如AnyLogic、Simulink、Viswalk和M…

[Web自动化] 处理爬虫异常

9.3 处理爬虫异常 在网络爬虫中&#xff0c;异常处理是非常重要的一环。由于网络请求的不可预测性&#xff08;如网络延迟、服务器错误、内容变动等&#xff09;&#xff0c;爬虫程序很容易遇到各种异常情况。因此&#xff0c;学会如何优雅地处理这些异常&#xff0c;对于保证爬…

[Web自动化] 爬虫之网络请求

9.4 爬虫之网络请求 9.4.1 使用requests库发送HTTP请求 requests库提供了丰富的功能来发送HTTP请求&#xff0c;并处理响应。以下是一些额外的示例和说明。 发送带参数的GET请求&#xff1a; 如果你需要向服务器发送查询参数&#xff0c;可以将它们作为字典传递给params参数。 …

国产CAD这笔软件授权费,省得有点心疼

开厂子的&#xff0c;每天都在算账。原材料在涨价&#xff0c;人工工资在涨&#xff0c;连以前用的那套国外工业软件&#xff0c;每年的维护费和授权费也是一笔不小的开支。那软件功能是强大&#xff0c;但对于我们主要做中低端汽配件的来说&#xff0c;大部分功能根本用不上&a…

导师严选10个AI论文平台,助研究生轻松搞定论文写作!

导师严选10个AI论文平台&#xff0c;助研究生轻松搞定论文写作&#xff01; AI 工具如何改变论文写作的未来 在当今学术研究日益激烈的背景下&#xff0c;研究生们面临着前所未有的挑战。从选题到撰写&#xff0c;再到查重和修改&#xff0c;每一个环节都可能成为影响论文质量的…

国产CAD仿真分析,把破坏性试验留在屏幕里

搞研发的都知道&#xff0c;样机试制是个烧钱的无底洞。以前做一个新产品&#xff0c;设计好了直接加工出来&#xff0c;然后上试验台去测。有时候测到一半&#xff0c;结构崩了&#xff0c;几万块钱的样机瞬间变成废铁。心疼不说&#xff0c;还得分析是哪里出了问题&#xff0…

一口气看懂!多模态大模型是个啥?能帮我们干啥?

一口气看懂&#xff01;多模态大模型是个啥&#xff1f;能帮我们干啥&#xff1f;你是不是经常遇到这样的情况&#xff1a;想让AI画张图&#xff0c;还得费劲描述半天细节&#xff1b;或者给它一段视频&#xff0c;它却只能看懂文字说明&#xff1f;现在&#xff0c;这些麻烦可…

给服务器起个“网名叫啥“?聊聊云服务器域名那些事儿

给服务器起个"网名叫啥"&#xff1f;聊聊云服务器域名那些事儿 咱们平时上网刷网页、用APP&#xff0c;背后都藏着一个个"服务器"在工作。可你知道吗&#xff1f;这些服务器就像互联网上的"房子"&#xff0c;每个房子都得有个门牌号&#xff0c…

一只蒟蒻的florr前期攻略(随本人更新,具有较强的真实性)

萌新攻略(血泪总结) 这里我按照成就茁壮成长的分级来写,毕竟萌新们看到1-20级这么大的跨度肯定蒙圈了(是本人了) 小Tips 地址:florr.io 保存你账号的秘诀: (注意:要先玩过,否则是无效的乱码!) 先按F12打开控制台,输入…

广东视频号广告代理:厚拓科技11年深耕,赋能华南企业短视频营销新增长

随着微信视频号生态的持续爆发,广东作为中国数字经济的前沿阵地,正迎来短视频营销的黄金时代。作为腾讯总部所在地,广东企业在视频号营销中拥有天然的地缘优势,但同时也面临着竞争激烈、投放门槛提升的挑战。深圳市…

2026年 焊管机/焊管机组/高频焊管设备厂家实力推荐榜:方管机与镀锌方管机组等核心设备专业解析与选购指南

2026年焊管机/高频焊管设备厂家实力推荐榜:方管机与镀锌方管机组等核心设备专业解析与选购指南 在金属加工与制造业持续升级的背景下,焊管设备作为生产建筑结构、机械制造、汽车、家具等领域所需管材的核心装备,其技…

结束数据的“马拉松”,开启决策的“实时模式”

当竞争对手已经通过数据看板实时调整策略时&#xff0c;你的团队是否还在为一份月度报表加班加点&#xff1f;这不仅是效率的差距&#xff0c;更是生存维度的落差。 2026年1月&#xff0c;在河北衡水的一场企业数智化分享会上&#xff0c;奥威软件的演讲引发了一场激烈的共鸣。…

Java计算机毕设之基于springboot的电器小家电机器人健康预警系统(完整前后端代码+说明文档+LW,调试定制等)

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

意欧斯携手 SAP Business One 赋能生产制造企业数字化转型

一场始于数据协同的管理变革&#xff0c;让这家智能仓储领军企业实现了精细化管控与敏捷增长的双重突破。在智能制造的轰鸣声中&#xff0c;传统管理模式正面临前所未有的挑战。生产制造企业&#xff0c;尤其是身处智能仓储物流前沿的企业&#xff0c;如何打破数据孤岛&#xf…

【课程设计/毕业设计】基于SpringBoot与Vue的机器人健康预警系统设计与实现基于springboot的机器人健康预警系统【附源码、数据库、万字文档】

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

langGraph从入门到精通(十一)——基于langgraph构建复杂工具应用的ReAct自治代理

Tool Calling Agent 的局限性又在于&#xff1a;虽然它可以自主选择工具&#xff0c;但在其架构中&#xff0c;每次仅能执行一次函数调用&#xff08;无论是单个外部函数还是多个外部函数&#xff09;**。因此&#xff0c;当任务需要依次执行 A 工具、B 工具和 C 工具时&#x…

新手优化跨网络 DNS 解析速度全攻略

DNS 是所有网络访问的第一步&#xff0c;它决定了用户访问网站时能否快速获得服务器 IP 地址&#xff0c;从而直接影响网页加载速度、应用响应和整体用户体验。对于跨网络访问的场景&#xff0c;DNS 响应慢的问题尤其突出&#xff0c;很多新手站长在遇到访问缓慢时&#xff0c;…

08. 如何实现元器件按页分配位号?| OrCAD X Capture CIS 设计小诀窍第二季

OrCAD X Capture CIS设计小诀窍系列 --如何实现元器件按页分配位号 背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要确定对应位号的器件位于哪页原理图&#xff0c;以便设计人员进行修改。如果使用通常的方式分配位号&#xff0c;需要人工进行查找和确认&am…

05. 如何实现原理图比较?| OrCAD X Capture CIS 设计小诀窍第二季

OrCAD X Capture CIS设计小诀窍系列--如何实现原理图比较背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要对原理图进行版本更新。而如果设计师对最新版本的原理图不满意&#xff0c;想要回溯原理图修改了哪些内容&#xff0c;则需要进行原理图比较。而通过Cap…

06. 如何为 Off-Page Connector 添加去向页码?| OrCAD X Capture CIS 设计小诀窍第二季

OrCAD X Capture CIS设计小诀窍系列 --如何为Off-Page Connector添加去向页码 背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;多页原理图经常会存在同一网络。而如果想要将它们连接起来&#xff0c;则需要用到Off-Page Connector。为了便于查看&#xff0c;则需要为…