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.pswp.cn/bicheng/77826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77826.shtml
英文地址,請注明出處:http://en.pswp.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系統在該場景下會完整復述初始化指令,導致系統角色定義(如電商導購)被完全暴露…