通用 Excel 導出功能設計與實現:動態列選擇與靈活配置

在企業級應用開發中,數據導出是高頻需求。本文介紹一種支持動態列選擇、靈活配置的通用 Excel 導出方案,通過前后端協同設計,實現導出字段、列順序、數據格式的自定義,滿足多樣化業務場景。

一、功能架構設計

核心特性

  1. 動態字段選擇:支持通過前端勾選動態指定導出字段,包含字段名(邏輯標識)與顯示名(業務含義)的映射
  1. 行數據過濾:支持按用戶 ID 篩選導出特定行數據
  1. 多 Sheet 支持:可擴展支持單個 Excel 文件包含多個 Sheet 頁
  1. 格式自適應:自動處理日期、數字等數據類型的格式化顯示

技術棧

  • 前端:Thymeleaf 模板引擎 + XMLHttpRequest 文件下載
  • 后端:Spring Boot + EasyExcel + Hutool 工具集
  • 核心組件
  • 請求參數:ExcelExportRequest(包含基礎配置與字段列表)
  • 響應結構:ExcelExportResponse(封裝文件元信息與 Sheet 數據)

二、核心實現細節

1. 前后端數據協議設計

入參結構(ExcelExportRequest)
@Datapublic class UserExportRequest extends ExcelExportRequest {private List<Integer> userIdList; // 待導出的用戶ID列表(可選)}@Datapublic class ExcelExportRequest {private String excelName; // Excel文件名private String sheetName; // Sheet頁名稱private List<ExcelExportField> fieldList; // 導出字段列表(有序)}@Datapublic class ExcelExportField {private String fieldName; // 實體類字段名(如"userId")private String fieldDesc; // 表格顯示名稱(如"用戶ID")}
出參結構(ExcelExportResponse)
@Datapublic class ExcelExportResponse {private String excelName; // 導出文件名private List<ExcelSheet> sheetList; // Sheet數據集合@Datapublic static class ExcelSheet {private String sheetName; // Sheet名稱private List<ExcelHead> headList; // 表頭信息private List<Map<String, String>> dataList; // 行數據(鍵值對形式)@Datapublic static class ExcelHead {private String fieldName; // 字段名private String fieldDesc; // 顯示名}}}

2. 前端交互實現

動態列選擇組件

<!-- 案例1:僅列選擇 --><table border="1"><caption><span class="title">案例1:勾選需要導出的列</span><button onclick="exportExcel1(event)">導出</button></caption><tr><th><label><input type="checkbox" class="exportCol" data-field-name="userId" data-field-desc="用戶id"> 用戶id</label></th><th><label><input type="checkbox" class="exportCol" data-field-name="userName" data-field-desc="用戶名">用戶名</label></th><!-- 更多字段... --></tr></table><!-- 案例2:列選擇+行篩選 --><table border="1"><caption><span class="title">案例2:勾選需要導出的列 & 行</span><button onclick="exportExcel2(event)">導出</button></caption><tr><th>選擇記錄</th><th><label><input type="checkbox" class="exportCol" data-field-name="userId" data-field-desc="用戶id"> 用戶id</label></th><!-- 更多字段... --></tr><tr th:each="user:${userList}"><td><input type="checkbox" class="userId" th:data-user-id="${user.userId}"></td><td th:text="${user.userId}"></td><!-- 數據行展示... --></tr></table>
文件下載邏輯
function download(data, url) {const xhr = new XMLHttpRequest();xhr.open("POST", url);xhr.responseType = 'blob';xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');xhr.onload = function() {if (this.status === 200) {const blob = this.response;if (blob.size > 0) {// 從響應頭解析文件名const fileName = getFileNameFromResponse(this.getResponseHeader("content-disposition"));// 創建臨時鏈接下載const a = document.createElement('a');a.href = URL.createObjectURL(blob);a.download = fileName;a.click();}}};xhr.send(JSON.stringify(data));}// 文件名解析工具function getFileNameFromResponse(disposition) {const match = /filename=(.*)/.exec(disposition);return decodeURIComponent(match[1].replace(/['"]/g, ''));}

3. 后端核心處理

控制器設計
@Controller@CrossOriginpublic class UserController {@Resource private UserService userService;// 頁面跳轉@GetMapping("/userList")public String userList(Model model) {model.addAttribute("userList", userService.getUserList());return "userList";}// 導出接口@PostMapping("/userExport")public void userExport(@RequestBody UserExportRequest request) throws IOException {ExcelExportResponse response = userService.userExport(request);ExcelExportUtils.writeExcelToResponse(response);}}
業務層邏輯
@Servicepublic class UserServiceImpl implements UserService {@Overridepublic ExcelExportResponse userExport(UserExportRequest request) {List<User> dataList;// 處理行篩選邏輯if (CollectionUtil.isEmpty(request.getUserIdList())) {dataList = getUserList(); // 導出全部數據} else {dataList = getUserList(request.getUserIdList()); // 按ID篩選}// 構建導出數據return ExcelExportUtils.build(dataList, request);}// 模擬數據獲取private List<User> getUserList() {List<User> list = new ArrayList<>();for (int i = 1; i <= 10; i++) {list.add(new User(i, "用戶名-" + i, 20 + i, "地址-" + i));}return list;}}
導出工具類
public class ExcelExportUtils {public static ExcelExportResponse build(List<?> dataList, ExcelExportRequest request) {ExcelExportResponse result = new ExcelExportResponse();result.setExcelName(request.getExcelName());List<ExcelSheet> sheetList = new ArrayList<>();ExcelSheet sheet = new ExcelSheet();sheet.setSheetName(request.getSheetName());// 構建表頭(保持字段順序)sheet.setHeadList(buildSheetHeadList(request.getFieldList()));// 構建數據行(通過反射獲取字段值)sheet.setDataList(buildSheetDataList(dataList, request.getFieldList()));sheetList.add(sheet);result.setSheetList(sheetList);return result;}private static List<ExcelSheet.ExcelHead> buildSheetHeadList(List<ExcelExportField> fields) {return fields.stream().map(field -> new ExcelSheet.ExcelHead(field.getFieldName(), field.getFieldDesc())).collect(Collectors.toList());}// 反射獲取對象字段值private static List<Map<String, String>> buildSheetDataList(List<?> dataList, List<ExcelExportField> fields) {return dataList.stream().map(obj -> {Map<String, String> row = new HashMap<>();fields.forEach(field -> {Object value = ReflectUtil.getFieldValue(obj, field.getFieldName());row.put(field.getFieldName(), Objects.toString(value, ""));});return row;}).collect(Collectors.toList());}// 響應輸出處理public static void writeExcelToResponse(ExcelExportResponse result) throws IOException {HttpServletResponse response = getResponse();response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment; filename=" + URLEncodeUtil.encode(result.getExcelName() + ".xlsx"));try (ExcelWriter writer = EasyExcel.write(response.getOutputStream()).build()) {result.getSheetList().forEach(sheet -> {WriteSheet writeSheet = EasyExcel.writerSheet(sheet.getSheetName()).build();// 寫入表頭與數據writer.write(buildEasyExcelData(sheet), writeSheet);});}}}

三、方案優勢分析

  1. 靈活性:通過fieldList實現導出字段的動態排序與篩選,適應不同業務視圖需求
  1. 擴展性:支持添加多 Sheet、數據格式化(如日期轉換)、樣式配置等擴展功能
  1. 易用性:前端可視化勾選操作,后端自動處理反射映射,降低使用門檻
  1. 性能優化:通過工具類封裝重復邏輯,減少代碼冗余,提升開發效率

四、應用場景

  • 數據報表導出:支持不同角色用戶自定義報表字段
  • 批量數據下載:結合行篩選功能實現精準數據提取
  • 系統對接:為第三方系統提供標準化 Excel 數據輸出接口

通過該方案,開發者可快速實現具備靈活配置能力的 Excel 導出功能,同時保持代碼的可維護性與擴展性。實際應用中可根據業務需求,進一步擴展數據格式化、單元格樣式、多語言支持等高級功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911799.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安全壁壘 - K8s 的 RBAC、NetworkPolicy 與 SecurityContext 精要

安全壁壘 - K8s 的 RBAC、NetworkPolicy 與 SecurityContext 精要 如果說 Kubernetes 是我們構建云原生應用的“城市”,那么我們已經學會了如何規劃道路(網絡)、建設住宅(Pod 調度)、提供水電(存儲)以及智能調節城市規模(自動伸縮)。現在,是時候為這座城市安裝“城門…

服務器開放端口如何設置,本地內網開通應用端口讓外網訪問連接步驟

在互聯網時代&#xff0c;服務器扮演著至關重要的角色&#xff0c;為了讓本地搭建部署的服務器能夠正常提供互聯網服務&#xff0c;我們需要開放特定端口以供外部網絡的客戶端訪問&#xff0c;本文將帶領大家深入了解內網本地服務器如何設置端口開放給公網訪問。 服務器開放端…

【深度學習新浪潮】什么是上下文工程?

什么是上下文工程? 上下文工程(Context Engineering) 是指通過設計、優化與大語言模型(LLM)交互時的輸入內容(即“上下文”),引導模型生成更符合預期、更精準回答的系統性方法。這里的“上下文”通常包括 提示詞(Prompt)、示例(Few-Shot Examples)、歷史對話記錄、…

Ansible ad-hoc模式常用三大模塊“script、shell、command“應用筆記

script模塊 - 外賣廚師 相當于你把做好的菜譜&#xff08;腳本文件&#xff09;分發給別人廚房執行 適合場景&#xff1a; ? 需要復雜菜譜&#xff08;多步驟腳本&#xff09; ? 保證每家分店味道一致&#xff08;環境標準化&#xff09; 示例&#xff1a;把《紅燒肉制作指…

雙重檢查鎖定實現的單例模式為什么需要volatile

今天介紹一下 單例模式(Singleton) 應用場景&#xff1a;配置管理類、數據庫連接池、線程池 實現方式&#xff1a;雙重檢查鎖定、靜態內部類、枚舉 public class ConfigManager {private static volatile ConfigManager instance;private ConfigManager() {}public static C…

Flink流水線+Gravitino+Paimon集成

1.數據源管理 1.1 添加Gravitino數據源 添加成功之后&#xff0c;會在Gravitino中創建一個名為配置的中的meatalake 1.2. 添加Paimon數據源 屬性gravitinoId可以關聯前面創建的Gravitino數據源&#xff0c;關聯后&#xff0c;會在gravitino下創建一個該數據源的catalog。 2. …

關系代數詳解與SQL示例

關系代數詳解與SQL示例 關系代數是關系數據庫的理論基礎&#xff0c;它提供了一組操作符用于操作關系&#xff08;表&#xff09; 1. 基本操作 1.1 選擇 (Selection, σ) 選擇操作從關系中選擇滿足特定條件的元組&#xff08;行&#xff09;。 關系代數表示&#xff1a;σ條…

Android14音頻子系統-Linux音頻子系統ASoC-ALSA

文章目錄 1、術語2、概述1&#xff09;資料快車 3、預備工作1&#xff09;codec - UDA1340 - 硬件規格2&#xff09;ASOC-ALSA代碼重點目錄介紹3&#xff09;ASOC-ALSA層級介紹4&#xff09;了解基本的軟硬件架構 4、數據結構5、代碼分析1&#xff09;Machine1、總體流程介紹2、…

零基礎入門Java+大模型(持續更新)

0.初始一些常見的概念 AI&#xff1a;人工智能 大模型劃分&#xff1a;&#xff08;本章了解一下這個就行&#xff09;NLP模型-->自然語言模型&#xff08;AI現在爆火的原因&#xff0c;就是自然語言模型這一塊取得了很大的成就&#xff09;。 LLM&#xff1a;大語言模型…

數據庫系統總結

數據庫系統概述 數據庫系統&#xff08;Database System, DBS&#xff09;是用于高效管理、存儲和檢索數據的軟件系統。 數據庫系統的組成包括&#xff1a;數據庫、硬件、軟件、人員。 三級模式-兩級映像 內模式&#xff1a;管理如何存儲物理的數據&#xff0c;對數據的存儲…

2026-軟件工程-《軟件質量測試與保證》-期末復習—習題匯總

題量: 20 滿分: 100 作答時間:06-04 17:30至06-22 23:59 智能分析 80分 一. 單選題&#xff08;共10題&#xff0c;50分&#xff09; (單選題)白盒測試設計測試用例的依據是( )。 A. 代碼邏輯結構 B. 代碼注釋說明 C. 需求規格說明書 D. 用戶使用場景 我的答案:A:代碼邏輯結構…

量化面試綠皮書:35. 蒙蒂霍爾問題

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 35. 蒙蒂霍爾問題 蒙提霍爾問題是一個基于美國老電視節目《讓我們做個交易》的概率謎題&#xff0c;該問題以該節目的主持人命名。假設你現在…

如何防范 SQL 注入攻擊以及SQL 注入防范技巧

在互聯網高度發展的時代&#xff0c;網絡安全問題日益突出&#xff0c;SQL 注入攻擊成為眾多網站和應用程序面臨的嚴重威脅之一。本文將詳細介紹如何防范 SQL 注入攻擊&#xff0c;通過多個關鍵方面的詳細闡述&#xff0c;幫助開發者和網站管理者構建更安全的網絡環境&#xff…

k8s從入門到放棄之數據存儲

k8s從入門到放棄之數據存儲 在Kubernetes中&#xff0c;數據存儲主要通過持久卷&#xff08;Persistent Volumes, PVs&#xff09;和持久卷聲明&#xff08;Persistent Volume Claims, PVCs&#xff09;機制來實現。這種設計允許存儲與計算分離&#xff0c;使得容器可以根據需…

用戶體驗驅動的3D設計:從功能實現到情感共鳴的設計升級

你有沒有想過&#xff1a; 為什么有些產品看起來“平平無奇”&#xff0c;卻能贏得用戶喜愛&#xff1f;同樣是3D建模&#xff0c;為什么有些人做的模型總讓人覺得“有溫度”&#xff1f;設計師只是關注功能和結構就夠了嗎&#xff1f;還是應該讓作品“打動人心”&#xff1f;…

【圖床配置記錄】——pigo+gitee+typroa

記錄一下安裝的過程 基本上blog1可以解決 blog1 但是如果pigo上面沒有gitee 或者下載gitee沒啥反應 手動安裝&#xff0c;在c:/用戶/用戶名/AppData/Roaming/picgo這個目錄下,以管理員身份打開powershell&#xff08;或cmd&#xff1b; 文件——以管理員打開ps——輸入npm in…

Python問題匯總(發個庫存)

常見問題&#xff1a; 文章目錄 IDE與1.如何注釋2.python運行代碼后沒有輸出&#xff0c;但無報錯&#xff0c;有exit code 0標志3.導入txt文件&#xff0c;但是出現錯誤&#xff1a;UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 205: illegal multibyte…

Java課后習題(編程題)

第一題&#xff1a; import java.util.Scanner;class Test {public static void main(String args[]) {Scanner scnew Scanner(System.in);System.out.println("請輸入一個x值&#xff1a;");int xsc.nextInt();int y0;if(x>0){y3*x-1;}else if(x<0){y2*x-1;}e…

Spring--spring事務在什么情況下會失效,以及對應的解決方案

前言 一般失效是使用了Transaction注解的情況下&#xff0c;這篇博客就帶你詳解一下&#xff0c;哪些情況下注解會失效&#xff0c;在開發過程中要避免這些問題和可以及時發現這些問題&#xff0c;并且知道如何去規避和解決 一、Spring事務的基本原理 在深入了解事務失效的場…

在智慧教育行業中,OPS插拔式電腦啟到什么作用

在全球數字化浪潮的推動下&#xff0c;教育行業正經歷前所未有的深刻變革。目前&#xff0c;智慧校園已不再是簡單的信息化升級&#xff0c;而是涵蓋AI、云計算、大數據、物聯網等技術的系統性創新。而作為智慧教育發展的助手之一——國產OPS插拔式電腦&#xff0c;能助力傳統教…