news 2026/4/18 8:27:39

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/4/17 23:20:29

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

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

作者头像 李华
网站建设 2026/4/17 17:41:07

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

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

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

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

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

作者头像 李华
网站建设 2026/4/15 12:35:40

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

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

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

动手学数据分析:实战系列(第一天)

Hands-on data analysis— 动手学数据分析 写在最前面 这门课程得主要目的是通过真实的数据&#xff0c;以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。知道了课程的目的之后&#xff0c;我们接下来我们要正式的开始数据分析的实战教学&#xff0c;完成kagg…

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

基于SpringBoot农产品商城系统毕业设计项目源码

题目简介在农产品产销环节存在 “产地与消费端对接低效、流通环节多、品控难追溯、农户收益低” 的行业痛点背景下&#xff0c;基于 SpringBoot 的农产品商城系统的构建具有重要现实意义与产业价值&#xff1a;从农户 / 产地端来看&#xff0c;系统打破传统线下批发的地域限制&…

作者头像 李华