news 2026/6/28 23:52:02

java 实现导出excel

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java 实现导出excel

方案一:封装通用工具类(推荐)

这种方式最灵活,可以在 Service 层或者 Controller 层显式地调用导出逻辑。

1. 编写 ExcelUtil 工具类

这个类主要负责:设置浏览器响应头(防止中文乱码)、创建 Excel Writer 并写入数据。

packagecom.example.demo.util;importcom.alibaba.excel.EasyExcel;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.net.URLEncoder;importjava.util.List;publicclassExcelUtil{/** * 通用导出方法 * * @param response HttpServletResponse * @param data 导出的数据集合 * @param head Excel 表头实体类 * @param fileName 文件名(不需要包含 .xlsx) * @param sheetName sheet 名称 */publicstaticvoidexport(HttpServletResponseresponse,List<?>data,Class<?>head,StringfileName,StringsheetName){try{// 1. 设置响应类型response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 2. 设置文件名(解决中文乱码问题)StringencodedFileName=URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+","%20");response.setHeader("Content-Disposition","attachment;filename*=utf-8''"+encodedFileName+".xlsx");// 3. 写入数据到输出流EasyExcel.write(response.getOutputStream(),head).sheet(sheetName).doWrite(data);}catch(IOExceptione){e.printStackTrace();// 如果出错,重置 response,返回 JSON 错误提示response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");try{response.getWriter().println("{\"code\": 500, \"message\": \"导出失败: "+e.getMessage()+"\"}");}catch(IOExceptionex){ex.printStackTrace();}}}}
2. 在 Controller 中调用

在 Controller 方法参数中注入HttpServletResponse,然后调用工具类即可。

@RestController@RequestMapping("/excel")publicclassExcelController{@GetMapping("/manual-export")publicvoiddownload(HttpServletResponseresponse){// 1. 准备数据 (模拟从数据库查询)List<UserExcelVO>list=newArrayList<>();list.add(newUserExcelVO(1L,"张三",20,newDate(),"pwd"));list.add(newUserExcelVO(2L,"李四",25,newDate(),"pwd"));// 2. 调用工具类导出// 注意:这里不需要返回值,因为直接操作了 Response 流ExcelUtil.export(response,list,UserExcelVO.class,"用户报表","Sheet1");}}

方案二:直接在 Controller 中写逻辑(适合复杂定制)

如果你需要极其复杂的导出逻辑(例如:动态表头、一个文件包含多个 Sheet、根据参数动态合并单元格等),封装的工具类可能不够用,这时直接写在 Controller 里最合适。

@GetMapping("/complex-export")publicvoidcomplexExport(HttpServletResponseresponse)throwsIOException{// 1. 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");StringfileName=URLEncoder.encode("复杂报表","UTF-8");response.setHeader("Content-Disposition","attachment;filename*=utf-8''"+fileName+".xlsx");// 2. 准备数据List<UserExcelVO>userList=getUserData();List<OrderExcelVO>orderList=getOrderData();// 3. 使用 ExcelWriter 实现多 Sheet 导出try(ExcelWriterexcelWriter=EasyExcel.write(response.getOutputStream()).build()){// Sheet 1: 用户信息WriteSheetwriteSheet1=EasyExcel.writerSheet(0,"用户信息").head(UserExcelVO.class)// 使用 User 类的注解作为表头.build();excelWriter.write(userList,writeSheet1);// Sheet 2: 订单信息WriteSheetwriteSheet2=EasyExcel.writerSheet(1,"订单信息").head(OrderExcelVO.class)// 使用 Order 类的注解作为表头.build();excelWriter.write(orderList,writeSheet2);}// try-with-resources 会自动调用 excelWriter.finish()}

方案对比

方式优点缺点适用场景
注解 (AOP)代码极简,业务代码完全不感知导出逻辑。逻辑隐蔽,灵活性较差(难以处理多Sheet、动态表头)。标准化的列表导出。
工具类 (Util)折中方案。代码复用性高,清晰直观。仍需要在 Controller 显式调用。大多数通用业务导出。
原生写法最灵活,可控制 Excel 的每一个细节。代码冗余,每个接口都要写 Response Header 设置。多 Sheet、动态表头、合并单元格等复杂报表。

注意事项:

无论使用哪种非注解方式,关键点都是:Controller 方法的参数要加上HttpServletResponse response,并且方法的返回值建议设为void,因为数据是直接写入 HTTP 输出流的,不需要 Spring MVC 再去处理返回值。

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

基于Python的健身房管理系统源码设计与文档

前言在健身房精细化运营需求提升、传统管理模式存在 “会员管理混乱、课程预约低效、数据统计滞后、私教跟进缺位” 的痛点背景下&#xff0c;基于 Python 的健身房管理系统构建具有重要的商业与实用价值&#xff1a;从会员管理层面&#xff0c;系统依托 Python 的数据库交互能…

作者头像 李华
网站建设 2026/6/26 1:48:39

NVIDIA HGX™ B300 GPU Droplet 服务器,即将上线DigitalOcean 云平台!

人工智能正以史无前例的速度演进&#xff0c;新的模型和繁重的负载不断突破可能的边界。从复杂的大型语言模型&#xff08;LLM&#xff09;到精密的科学模拟&#xff0c;开发者与企业都需要获得最强大、最高效的算力基础设施。在 DigitalOcean&#xff0c;我们致力于提供顶级的…

作者头像 李华
网站建设 2026/6/26 18:48:57

基于SpringBoot旅游包车管理系统毕业设计项目源码

题目简介 在旅游包车行业存在 “供需对接碎片化、车辆调度效率低、行程监管缺失、费用结算不透明” 的行业痛点背景下&#xff0c;基于 SpringBoot 的旅游包车管理系统的构建具有重要现实意义与产业价值&#xff1a;从游客 / 旅行社端来看&#xff0c;系统打破传统线下找车、议…

作者头像 李华
网站建设 2026/6/28 17:24:51

硬件升级全攻略:从评估到优化

硬件升级前的准备工作评估当前硬件配置&#xff0c;包括处理器、内存、存储、显卡等关键部件的型号和性能。使用系统信息工具或第三方软件如CPU-Z、GPU-Z获取详细数据。明确升级目标和预算&#xff0c;确定是提升游戏性能、多任务处理能力还是存储速度。不同需求对应不同的硬件…

作者头像 李华
网站建设 2026/6/27 2:16:56

基于SpringBoot框架的个人博客系统毕业设计项目源码

题目简介在自媒体创作普及、个人内容表达需求日益增长的背景下&#xff0c;传统博客系统存在开发复杂度高、功能适配性差、内容管理低效、交互体验单一的痛点&#xff0c;难以满足创作者轻量化搭建、精细化运营个人内容平台的需求。基于 SpringBoot 框架的个人博客系统构建具有…

作者头像 李华
网站建设 2026/6/26 11:48:22

C++三大特性:封装、继承与多态深度解析

引言 C作为一门强大的面向对象编程语言&#xff0c;其核心的三大特性——封装、继承和多态&#xff0c;构成了面向对象编程的基石。 这三大特性不仅使代码更模块化、可重用&#xff0c;还大大提升了软件的可维护性和扩展性。本文将深入探讨这三大特性的技术细节、实现机制和最…

作者头像 李华