Spring Boot 实现 Excel 导出功能(支持前端下载 + 文件流)

🧠 一、为什么用 EasyExcel?

在 Java 开发中,操作 Excel 的框架主要有:

  • Apache POI(经典但慢、内存占用大)

  • JXL(老旧不维护)

  • Alibaba EasyExcel(阿里出品,性能好,写入快,注解灵活)

EasyExcel 优点:

  • 注解式开发,简单直观

  • 支持大量数据写入不 OOM

  • 支持复杂表头、样式、合并单元格

今天我们用 EasyExcel 实现后端导出 Excel 文件并支持前端下载。


📦 二、添加依赖(Maven)

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>

🧱 三、定义导出数据结构

创建一个导出用的数据对象(VO),使用 @ExcelProperty 注解指定表头名和字段顺序:

package com.example.excel.vo;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class UserExportVO {@ExcelProperty(value = "用户名", index = 0)private String username;@ExcelProperty(value = "手机号", index = 1)private String phone;@ExcelProperty(value = "注册时间", index = 2)private String registerTime;
}

🖥️ 四、后端导出接口

创建一个下载接口,核心是将 Excel 写入 HttpServletResponse 输出流。

@GetMapping("/api/export")
public void exportUserList(HttpServletResponse response) throws IOException {List<UserExportVO> dataList = getMockData(); // 获取数据(或从数据库查询)// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("用户信息导出", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 写数据到响应输出流EasyExcel.write(response.getOutputStream(), UserExportVO.class).sheet("用户信息").doWrite(dataList);
}

✅ 示例 mock 数据方法

private List<UserExportVO> getMockData() {List<UserExportVO> list = new ArrayList<>();for (int i = 1; i <= 10; i++) {UserExportVO user = new UserExportVO();user.setUsername("用户" + i);user.setPhone("188888888" + i);user.setRegisterTime("2025-04-10");list.add(user);}return list;
}

🌐 五、前端调用方式

方式一:直接触发下载(window.open)

window.open('/api/export', '_blank');

方式二:使用 Axios 下载 Blob

axios({url: '/api/export',method: 'GET',responseType: 'blob'
}).then((res) => {const blob = new Blob([res.data], { type: res.headers['content-type'] });const link = document.createElement('a');link.href = window.URL.createObjectURL(blob);link.download = '用户信息.xlsx';link.click();
});

🧩 六、常见问题解答

❓1. 文件名乱码?

✅ 使用 URLEncoder.encode(fileName, "UTF-8") 编码,并加 replaceAll("\\+", "%20")

❓2. 表头顺序错乱?

✅ 使用 @ExcelProperty(index = x) 指定每列的顺序。

❓3. 导出文件打不开?

✅ 确保响应头设置正确,文件类型为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

❓4. 导出大量数据内存溢出?

✅ EasyExcel 默认使用 streaming write,但建议分页获取数据、分批写入。


📌 七、结语

到这里,我们已经完成了:

✅ 使用 EasyExcel 构建导出数据结构
✅ 实现了后端文件流输出接口
✅ 支持前端触发导出并自动下载 Excel

📁 导出功能在企业系统中非常常见,如果你在写后台管理系统,这篇教程绝对值得收藏!

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

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

相关文章

【论文速递】2025年06周 (Robotics/Embodied AI/LLM)

目录 SMOLLM2&#xff1a;当Smol变得大 - 以数据为中心的小语言模型英文摘要中文摘要 OmniHuman-1&#xff1a;重新考虑一阶段的人类动画模型的扩展英文摘要中文摘要 S1&#xff1a;简单的测试时间缩放英文摘要中文摘要 直接对齐算法间的差异日渐模糊英文摘要中文摘要 VideoJAM…

学习深度学习是否要先学习机器学习?工程师的路径选择策略

深度学习与机器学习的关系&#xff0c;如同摩天大楼与地基——前者是后者的高阶延伸&#xff0c;但能否绕过地基直接造楼&#xff1f;本文从技术本质、学习曲线、应用场景三个维度剖析这一关键问题。 一、技术血脉的承继关系 概念体系同源&#xff1a; 损失函数、梯度下降、过拟…

开始放飞之先搞个VSCode

文章目录 开始放飞之先搞个VSCode重要提醒安装VSCode下载MinGW-w64回到VSCode中去VSCode原生调试键盘问题遗留问题参考文献 开始放飞之先搞个VSCode 突然发现自己的新台式机上面连个像样的编程环境都没有&#xff0c;全是游戏了&#xff01;&#xff01;&#xff01;&#xff…

【2025“华中杯”大学生数学建模挑战赛】选题分析 A题 详细解题思路

目录 2025“华中杯”大学生数学建模挑战赛选题分析A题&#xff1a;晶硅片产销策略优化B题&#xff1a;校园共享单车的调度与维护问题C题&#xff1a;就业状态分析与预测D题&#xff1a;患者院内转运不良事件的分析与预测 A 题 晶硅片产销策略优化问题 1&#xff1a;月利润计算模…

YOLO11改进,尺度动态损失函数Scale-based Dynamic Loss,减少标签不准确对损失函数稳定性的影响

在目标检测领域,标签噪声与尺度敏感问题始终是制约模型性能提升的"阿喀琉斯之踵"。2025年CVPR最佳论文提出的尺度动态损失函数(Scale-based Dynamic Loss, SDL),通过构建自适应损失调节机制,不仅实现了对YOLOv11检测精度的指数级提升,更重新定义了损失函数的设…

缓存 --- 内存缓存 or 分布式缓存

缓存 --- 内存缓存 or 分布式缓存 内存缓存&#xff08;In-Memory Cache&#xff09;分布式缓存&#xff08;Distributed Cache&#xff09;内存缓存 vs 分布式缓存 内存缓存和分布式缓存是两种常见的缓存策略&#xff0c;它们在存储位置、访问速度和适用场景上有所不同。下面分…

Python+CoppeliaSim+ZMQ remote API控制机器人跳舞

这是一个使用Python和CoppeliaSim&#xff08;V-REP&#xff09;控制ASTI人型机器人进行舞蹈动作的演示项目。 项目描述 本项目展示了如何使用Python通过ZeroMQ远程API与CoppeliaSim仿真环境进行交互&#xff0c;控制ASTI人型机器人执行预定义的舞蹈动作序列。项目包含完整的机…

进程管理,关闭进程

查看Linux系统中的进程信息 语法&#xff1a;ps【-e -f】 一般与管道符与grep配合使用&#xff0c;&#xff0c;去过滤指定的信息 -e&#xff1a;显示出全部的进程 -f&#xff1a;以完全格式化的形式展示信息&#xff08;展示全部信息&#xff09; 简单用法&#xff1a;p…

线性代数-矩阵的秩

矩阵的秩&#xff08;Rank&#xff09;是线性代数中的一个重要概念&#xff0c;表示矩阵中线性无关的行&#xff08;或列&#xff09;的最大数量。它反映了矩阵所包含的“有效信息”的维度&#xff0c;是矩阵的核心特征之一。 直观理解 行秩与列秩&#xff1a; 行秩&#xff1…

CSS伪类、clip-path实现三角形、箭头绘制

<template><div :class"$options.name"><div class"triangle-container1"><!-- 伪类三角形&#xff1a;向右 --><div class"triangle-RM"></div><!-- 伪类三角形&#xff1a;向下 --><div class&q…

numpy、pandas内存优化操作整理

前言 python作为一款不怎么关注数据类型的语言&#xff0c;不同类型的数据可以往同一个变量中放置 这也就直接导致&#xff0c;作为熟悉C这种一个变量只有一个类型的程序员来说&#xff0c;在解读python程序时&#xff0c;想搞清楚变量中到底存的是什么数据类型的时候时常很头…

Linux本地&远程主机文件传输

一.实验环境 sshd 是SSH (Secure Shell)协议的守护进程。 功能用途 远程安全连接: sshd允许用户通过网络安全地登录到远程服务器。在传统的Telnet等协议中&#xff0c;数据传输是明文的&#xff0c; 容易被窃取和篡改。而SSH协议通过加密技术&#xff0c;对传输的数据进行加…

Windows网络及服务:制作系统盘

今天我要介绍的是一个比较有意思且好玩的一个小玩意儿&#xff1a;关于系统盘的制作&#xff1b; 注明&#xff1a;对于系统盘的制作&#xff0c;以及接下来的课程&#xff0c;基本是作为动手课业来进行的&#xff0c;这也是作为程序员的必要进行的一项活动。 对于系统盘&…

【人工智能】大模型的Prompt工程:释放DeepSeek潜能的艺术与科学

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 Prompt工程是大模型应用中的关键技术,通过精心设计的提示词(Prompt),用户能够有效引导模型生成高质量输出。本文深入探讨了优化DeepSee…

企业管理战略转型与模式创新策略

一、战略思维创新 在当前数字经济快速扩张的背景下&#xff0c;企业战略需紧密追随时代潮流&#xff0c;致力于深度创新以适应市场的瞬息万变。这一创新主要围绕两大战略核心展开&#xff0c;一是跨界融合策略&#xff0c;二是生态系统策略&#xff0c;它们共同塑造了企业在新…

1-1 什么是数据结构

1.0 数据结构的基本概念 数据结构是计算机科学中一个非常重要的概念&#xff0c;它是指在计算机中组织、管理和存储数据的方式&#xff0c;以便能够高效地访问和修改数据。简而言之&#xff0c;数据结构是用来处理数据的格式&#xff0c;使得数据可以被更有效地使用。 数据结构…

03-HTML常见元素

一、HTML常见元素 常见元素及功能&#xff1a; 元素用途<h1>~<h6>标题从大到小<p>段落&#xff0c;不同段落会有间距<img>显示图片&#xff0c;属性src为图片路径&#xff0c;alt为图片无法显示时的提示文本<a>超链接&#xff0c;属性href为链…

使用Cloudflare加速网站的具体操作步骤

要通过Cloudflare加速网站&#xff0c;您需要按照以下步骤进行设置和配置。这些步骤包括域名设置、接入Cloudflare、配置缓存和其他设置&#xff0c;以及测试网站性能。 1. 注册Cloudflare账户 访问Cloudflare官网&#xff1a;前往 Cloudflare官网。创建账户&#xff1a;点击…

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中&#xff0c;高度&#xff08;Height&#xff09;和深度&#xff08;Depth&#xff09;是两个容易混淆的概念。本文通过示例和代码实现&#xff0c;帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…

AI Agent开发第35课-揭秘RAG系统的致命漏洞与防御策略

第一章 智能客服系统的安全悖论 1.1 系统角色暴露的致命弱点 当用户以"你好"开启对话后追问"你之前说了什么",看似无害的互动实则暗藏杀机。2024年数据显示,93%的开源RAG系统在该场景下会完整复述初始化指令,导致系统角色定义(如电商导购)被完全暴露…