easyPoi實現動表頭Excel的導入和導出

easyPoi實現動表頭Excel的導入和導出

Maven依賴

!-- EasyPoi 核心依賴 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><!-- EasyPoi Web支持 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.4.0</version></dependency><!-- EasyPoi 注解支持 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0</version></dependency><!-- Apache POI 基礎包 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- 處理 Excel 2007+ (xlsx) 必須的包 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><!-- 處理 XMLSchema/XSSF 時需要的 (推薦加上) --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><!-- 如果要導出圖片、圖表,推薦再加上 ooxml-schemas 全量包 --><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency>

實現類

/*** Created by ls on 2025/9/14.*/
@RestController
public class EasypoiController {/*** 導出 Excel (動態表頭)* 訪問: http://localhost:8080/exportDynamic*/@GetMapping("/exportDynamic")public void exportDynamic(HttpServletResponse response) throws Exception {// 1. 動態表頭配置(實際項目可從前端傳參)List<ExcelExportEntity> entityList = new ArrayList<>();entityList.add(new ExcelExportEntity("姓名", "name"));entityList.add(new ExcelExportEntity("年齡", "age"));entityList.add(new ExcelExportEntity("城市", "city"));entityList.add(new ExcelExportEntity("成績", "score"));// 2. 模擬數據List<Map<String, Object>> dataList = new ArrayList<>();dataList.add(mapOf("name", "張三", "age", 18, "city", "北京", "score", 95));dataList.add(mapOf("name", "李四", "age", 20, "city", "上海", "score", 88));dataList.add(mapOf("name", "王五", "age", 22, "city", "廣州", "score", 92));// 3. 生成 WorkbookExportParams params = new ExportParams("學生信息表", "Sheet1");Workbook workbook = ExcelExportUtil.exportExcel(params, entityList, dataList);// 4. 設置響應頭并下載String fileName = URLEncoder.encode("動態表頭示例.xlsx", "UTF-8");response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);workbook.write(response.getOutputStream());}// 小工具方法:快速構造 Mapprivate static Map<String, Object> mapOf(Object... kv) {Map<String, Object> m = new LinkedHashMap<>();for (int i = 0; i < kv.length; i += 2) {m.put(String.valueOf(kv[i]), kv[i + 1]);}return m;}/*** 動態導出 Excel* @param response HttpServletResponse*/@GetMapping("/export")public void exportExcel(HttpServletResponse response) throws Exception {// ======= 1. 動態表頭定義(可從前端傳 JSON,這里寫死示例) =======List<ExcelExportEntity> entityList = new ArrayList<>();entityList.add(new ExcelExportEntity("姓名", "name"));entityList.add(new ExcelExportEntity("年齡", "age"));entityList.add(new ExcelExportEntity("城市", "city"));entityList.add(new ExcelExportEntity("成績", "score"));// ======= 2. 模擬數據 =======List<Map<String, Object>> dataList = new ArrayList<>();dataList.add(mapOf("name", "張三", "age", 18, "city", "北京", "score", 95));dataList.add(mapOf("name", "李四", "age", 20, "city", "上海", "score", 88));// ======= 3. 生成 Excel =======ExportParams params = new ExportParams("學生信息表", "Sheet1");Workbook workbook = ExcelExportUtil.exportExcel(params, entityList, dataList);// ======= 4. 輸出到瀏覽器 =======String fileName = URLEncoder.encode("動態導出.xlsx", "UTF-8");response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);workbook.write(response.getOutputStream());}/*** 動態導入 Excel* @param file 上傳的 Excel 文件* @return 統一字段的數據*/@PostMapping("/import")public Map<String, Object> importExcel(@RequestParam("file") MultipartFile file) throws Exception {try (InputStream is = file.getInputStream();Workbook workbook = WorkbookFactory.create(is)) {Sheet sheet = workbook.getSheetAt(0);DataFormatter formatter = new DataFormatter();int headerStart = 1; // 從第二行開始,索引是 1(第一行索引是0)int headRows = 1; // 表頭占一行int firstCol = 0;int lastCol = sheet.getRow(headerStart).getLastCellNum();// 組裝表頭List<String> headers = new ArrayList<>();Row headerRow = sheet.getRow(headerStart);for (int c = firstCol; c < lastCol; c++) {Cell cell = headerRow.getCell(c);String val = cell != null ? formatter.formatCellValue(cell).trim() : "COLUMN_" + c;headers.add(val);}// 遍歷數據行List<Map<String, Object>> data = new ArrayList<>();int lastRow = sheet.getLastRowNum();for (int r = headerStart + headRows; r <= lastRow; r++) {Row row = sheet.getRow(r);if (row == null) continue;Map<String, Object> map = new LinkedHashMap<>();boolean allEmpty = true;for (int c = firstCol; c < lastCol; c++) {Cell cell = row.getCell(c);String val = cell != null ? formatter.formatCellValue(cell).trim() : "";if (!val.isEmpty()) allEmpty = false;map.put(headers.get(c - firstCol), val);}if (!allEmpty) data.add(map);}Map<String, Object> resp = new HashMap<>();resp.put("headers", headers);resp.put("data", data);return resp;}}}

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

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

相關文章

瘋狂星期四文案網第67天運營日記

網站運營第67天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況

CAS理解

CAS&#xff08;Compare And Swap&#xff09; 是非阻塞同步的實現原理&#xff0c;它是CPU硬件層面的一種指令&#xff1b; CAS制定操作包含三個參數 內存值&#xff08;內存地址&#xff09;v預期值E新增值N 當CAS指令執行時&#xff0c;當且僅當預期值E和內存值V相同時&…

【SQL】指定日期的產品價格

目錄 題目 分析 代碼 題目 產品數據表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_price | int | | change_date | date | ------------------------ (product_id, chang…

《突破Unity+騰訊云聯機瓶頸:多人游戲同步延遲與數據安全的雙維度優化》

在Unity開發的多人聯機游戲中&#xff0c;騰訊云的云服務器&#xff08;CVM&#xff09;、游戲多媒體引擎&#xff08;GME&#xff09;與云數據庫&#xff08;CDB&#xff09;共同構成了聯機體驗的核心支撐。但隨著玩家并發量提升與游戲玩法復雜度增加&#xff0c;“實時同步延…

BisenetV1/2網絡以及模型推理轉換

BisenetV1/2網絡以及模型推理轉換 文章目錄BisenetV1/2網絡以及模型推理轉換1 BiSenetV11.1 Contex Path1.2 Spatial Path1.3 ARM1.4 FFM1.5 backbone2 模型推理代碼流程分析2.1 加載模型2.2 模型推理① 轉換張量② 輸入尺寸調整③ 模型推理④ 輸出尺寸還原⑤ 類別預測⑥ 保存繪…

Android開發-文本輸入

一、EditText 基礎&#xff1a;不僅僅是輸入框EditText 是 TextView 的子類&#xff0c;允許用戶輸入和編輯文本。1. 基本布局<EditTextandroid:id"id/et_username"android:layout_width"match_parent"android:layout_height"wrap_content"an…

數據化存儲菜單,國際化方案

djangoclass Menu(models.Model):parent_id models.BigIntegerField(default0, verbose_name父菜單ID)name models.CharField(max_length50, verbose_name菜單名稱)icon models.CharField(max_length50, blankTrue, nullTrue, verbose_name菜單圖標)path models.CharField(…

SQL-用戶管理與操作權限

在 SQL 中&#xff0c;用戶管理和權限操作是數據庫安全管理的核心組成部分&#xff0c;用于控制 “誰能訪問數據庫” 以及 “能對數據庫做什么”。它們共同保障數據庫的安全性、完整性和合規性。一、用戶管理&#xff1a;控制 “誰能訪問數據庫”用戶管理是指對數據庫用戶的創建…

計算機視覺案例分享之答題卡識別

目錄 一、基本流程 二、代碼實現 1. 導入工具包和定義常量 2. 輔助函數定義 2.1 坐標點排序函數 2.2 透視變換函數 2.3 輪廓排序函數 2.4 圖像顯示函數 3. 主程序處理流程 3.1 圖像預處理 3.2 輪廓檢測與透視變換 3.3 閾值處理與選項檢測 3.4 答案識別與評分 我們…

Java面試問題記錄(四)

四、設計模式1、設計模式6大原則1&#xff09;單一職責(一個類和方法只做一件事)、2&#xff09;里氏替換(多態&#xff0c;子類可擴展父類)、3&#xff09;依賴倒置(細節依賴抽象&#xff0c;下層依賴上層)、4&#xff09;接口隔離(建立單一接口)、迪米特原則(最少知道&#x…

高等教育學

高等教育學第一章 高等教育與高等教育學第二章 高等教育發展史2-1西方高等教育發展史2-2中國高等教育發展史第三章 高等教育理念3.1-王一軍-高等教育理念的構成要素3.2-王一軍-高等教育理念的主要流派第四章 高等學校教育4.1 高等學校教育制度4.2-陳何芳-高等教育辦學體制 &…

unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤

文章目錄unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤問題出現的背景解決方案總結unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤 問題出現的背景 在我的一個老工程項目中&#xff0c;使用C的std::unordered_map時&#xff0c;使用了MFC的CStrin…

Maven 本地倉庫的 settings.xml 文件

本地倉庫目錄位置&#xff1a;C:/用戶/用戶名/.m2/repository 需要修改配置&#xff0c;具體的修改方法請看 ↓↓↓ 2024版 IDEA 用 Maven 創建 java 項目&#xff08;Maven 安裝和配置&#xff09; <?xml version"1.0" encoding"UTF-8"?><!…

vue動畫內置組件

文章目錄vue動畫的官方類名EnterLeaveTransition組件注意事項觸發實例TransitionGroup組件注意事項觸發機制實例拓展vue動畫的官方類名 如下來自vue官方文檔&#xff0c;提供了dom元素&#xff0c;插入Enter和刪除Leave的類名 Enter v-enter-from&#xff1a;進入動畫的起始…

軟考中級信息安全與病毒防護知識點

### 一、核心知識點梳理這部分內容可以大致分為三個方面&#xff1a;**信息安全基本概念**、**加解密技術** 和 **惡意代碼&#xff08;病毒&#xff09;防護**。#### 1. 信息安全的基本目標&#xff08;CIA三元組&#xff09; 這是所有信息安全問題的基石&#xff0c;必須熟練…

數組存儲 · 行主序與列主序 | 應用 / 基地址 / 選擇策略

注&#xff1a;本文為 “數組存儲 行主序與列主序” 相關合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 Row major and Column Major Address calculations 按行主序和按列主序的地址計算…

在 CentOS 中安裝 VirtualBox 增強功能的步驟

很好&#xff0c;你看到 /run/media/asfor/VBox_GAs_7.2.2&#xff0c;這說明你已經在 VirtualBox 中掛載了“增強功能&#xff08;Guest Additions&#xff09;”光盤&#xff0c;接下來只要手動安裝就可以啟用共享剪貼板、全屏分辨率、鼠標無縫移動等功能。&#x1f4dd; 在 …

Python快速入門專業版(三十):函數進階:函數嵌套與作用域(內部函數訪問外部變量)

目錄引一、函數嵌套&#xff1a;在函數內部定義函數1. 基本語法與調用方式示例1&#xff1a;簡單的函數嵌套結構2. 嵌套函數的典型應用&#xff1a;隱藏輔助邏輯示例2&#xff1a;用嵌套函數隱藏輔助邏輯二、嵌套函數的作用域&#xff1a;變量訪問規則1. 內部函數訪問外部函數的…

C++數組與字符串:從基礎到實戰技巧

C中的數組和字符串是處理數據集合和文本的基礎工具。數組用于存儲相同類型的元素集合&#xff0c;而字符串則專門用于處理文本數據。C提供了兩種主要的字符串處理方式&#xff1a;C風格字符串&#xff08;字符數組&#xff09;和C的std::string類。 &#x1f4ca; 1. 數組 (Arr…

艾邁斯歐司朗推出首款高功率多芯片激光器封裝

在投影顯示領域掀起技術革新的浪潮中&#xff0c;艾邁斯歐司朗猶如一位技藝精湛的工匠&#xff0c;精心打造出Vegalas Power系列高功率激光二極管的首顆明珠——PLPM7_455QA激光器。這款采用多顆GaN基功率激光器集成封裝的新品&#xff0c;在短脈沖周期內綻放出42W的璀璨光芒&a…