使用EasyExcel動態合并單元格(模板方法)

1、導入EasyExcel依賴

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

2、編寫實體類

@Data
publci class Student{ @ExcelProperty("姓名")private String name;
}

3、具體方法如下

調用方法(除了基礎的模板地址和數據外,增加了合并列索引和分組函數)

/*** 填充模板并合并單元格** @param tempName 模板名稱* @param list 填充數據集合* @param resultMap 特殊數據替換map* @param targetFilePath 導出地址* @param excelTypeEnum  ecxcel文件類型* @param mergeColumnIndex sheet中需要合并的列的索引* @param groupFunction    分組函數* @param <T>*/public static <T> void buildMergeExcel(String tempName, List<T> list, Map<String, String> resultMap, String targetFilePath, ExcelTypeEnum excelTypeEnum, int[] mergeColumnIndex, Function<T, String> groupFunction) {try {// 獲取模板文件ClassPathResource classPathResource = new ClassPathResource("template/" + tempName);// 行計數,初始值取列頭行數int lineCount = 1;// 分別填充list數據和特殊數據ExcelWriter excelWriter = EasyExcel.write(new File(LocalStoragePropertiesConstants.LOCAL_PROFILE + targetFilePath)).excelType(excelTypeEnum).withTemplate(classPathResource.getInputStream()).build();FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();List<CellRangeAddress> rangeCellList = createCellRange(list, mergeColumnIndex, lineCount, groupFunction);WriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(new MergeCellRangeWriteHandler(rangeCellList)).build();excelWriter.fill(list, fillConfig, writeSheet);excelWriter.fill(resultMap, writeSheet);list.clear();excelWriter.finish();} catch (IOException e) {throw new RuntimeException(e);}}

提前計算合并的單元格,在sheet創建后一次性合并

 /*** 生成合并區域** @param detailList       數據列表* @param mergeColumnIndex 要合并的列索引* @param startRowIndex    起始行(含表頭時,表頭行數)* @param groupFunction    分組函數,如 e -> e.get某字段()* @return 合并區域集合*/public static <T> List<CellRangeAddress> createCellRange(List<T> detailList, int[] mergeColumnIndex, int startRowIndex, Function<T, String> groupFunction) {if (detailList == null || detailList.isEmpty()) {return Collections.emptyList();}// 計算每個key下的數量Map<String, Long> groupMap = new LinkedHashMap<>();for (T item : detailList) {String key = groupFunction.apply(item);groupMap.put(key, groupMap.getOrDefault(key, 0L) + 1);}List<CellRangeAddress> rangeCellList = new ArrayList<>();// 當前行數int lineCount = startRowIndex;for (Map.Entry<String, Long> entry : groupMap.entrySet()) {int count = entry.getValue().intValue();if (count > 1) {int endRowIndex = lineCount + count - 1;for (int columnIndex : mergeColumnIndex) {rangeCellList.add(new CellRangeAddress(lineCount, endRowIndex, columnIndex, columnIndex));}}lineCount += count;}return rangeCellList;}

單元格合并策略

/*** easyExcel 合并單元格*/
public class MergeCellRangeWriteHandler implements SheetWriteHandler {private final List<CellRangeAddress> rangeCellList;public MergeCellRangeWriteHandler(List<CellRangeAddress> rangeCellList) {this.rangeCellList = (rangeCellList == null) ? Collections.emptyList() : rangeCellList;}public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Sheet sheet = writeSheetHolder.getSheet();for (CellRangeAddress cellRangeAddress : this.rangeCellList) {sheet.addMergedRegionUnsafe(cellRangeAddress);}}
}

調用如下:

        String sheetTitle = "模板名稱";FileResultVO fileResultVO = ExpandFileUtil.generateFilePath(EXTENSION_XLSX, sheetTitle + UUID.randomUUID(), EXTENSION_XLSX);ExpandEasyExcelUtil.buildMergeExcel("MB.xlsx",dataList, null, fileResultVO.getFilePath(),ExcelTypeEnum.XLSX,new int[]{0, 1, 2, 3, 4},Student::getName);

工作中實測使用,有什么問題歡迎留言交流

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

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

相關文章

jenkins 流水線比較簡單直觀的

//全篇沒用自定義變量pipeline {agent any// 使用工具自動配置Node.js環境tools {nodejs nodejs22 // 需在Jenkins全局工具中預配置該名稱的Node.js安裝}//下面拉取代碼通過的是流水線片段生成的stages {stage(Checkout Code) {steps {git branch: release-v1.2.6,credentials…

CV目標檢測中的LetterBox操作

LetterBox類比理解&#xff1a;想象你要把一張任意形狀的照片放進一個正方形的相框里&#xff0c;照片不能變形拉伸&#xff0c;所以你先等比例縮小照片&#xff0c;然后在空余的地方填上灰色背景。第1章 數學原理當我們有一個原始圖像的尺寸為 19201080&#xff08;寬高&#…

Leetcode 3614. Process String with Special Operations II

Leetcode 3614. Process String with Special Operations II 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3614. Process String with Special Operations II 1. 解題思路 這一題思路上是一個逆推的思路。 首先&#xff0c;我們順序走一輪不難得到最終我們能夠獲得的字符串…

.NET ExpandoObject 技術原理解析

&#x1f31f; .NET ExpandoObject 技術原理解析 引用&#xff1a; .NET 剖析4.0上ExpandoObject動態擴展對象原理風瀟瀟人渺渺快意刀山中草 #mermaid-svg-RtpHctpdchPPN1Xo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

放蘋果(信息學奧賽一本通-T1192)

【題目描述】把M個同樣的蘋果放在N個同樣的盤子里&#xff0c;允許有的盤子空著不放&#xff0c;問共有多少種不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一種分法。【輸入】第一行是測試數據的數目…

(懶人救星版)CNN_Kriging_NSGA2_Topsis(多模型融合典范)深度學習+SCI熱點模型+多目標+熵權法 全網首例,完全原創,早用早發SCI

全網首例&#xff0c;完全原創&#xff0c;早用早發SCI&#xff08;多模型融合典范&#xff09;機器學習SCI熱點模型多目標熵權法(懶人救星版)BP_Kriging_NSGA2_Topsis 改進克里金工作量大&#xff1a;多模型融合創新性&#xff1a;首次結合BP神經網絡和克里金多目標利用 BP神…

LeetCode熱題100【第一天】

第一題 兩數之和 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案&#xff0c;并且你不能使用兩次相同的元素。 你可以按任意順序返回…

AI Linux 運維筆記

運維基本概念 IT運維是指通過專業技術手段&#xff0c;確保企業的IT系統和網絡持續、安全、穩定運行&#xff0c;保障業務的連續性。運維涵蓋計算機網絡、應用系統、硬件環境和服務流程的綜合管理。主要分為: 系統運維、數據庫運維、自動化運維、容器運維、云計算運維、信創運維…

Redis性能基準測試

基準環境 機器&#xff1a;AWS EC2 c4.8xlarge&#xff08;同機部署 Redis Server 與 ReJSONBenchmark 工具&#xff0c;通過網絡棧連接&#xff09;測試工具&#xff1a;ReJSONBenchmark&#xff08;Go 實現、可配置并發&#xff09;模式&#xff1a;非管線&#xff08;non-pi…

XML外部實體注入與修復方案

XML外部實體注入&#xff08;XXE&#xff09;是一種嚴重的安全漏洞&#xff0c;攻擊者利用XML解析器處理外部實體的功能來讀取服務器內部文件、執行遠程請求&#xff08;SSRF&#xff09;、掃描內網端口或發起拒絕服務攻擊。以下是詳細解釋和修復方案&#xff1a;XXE 攻擊原理外…

解決高并發場景中的連接延遲:TCP 優化與隊頭阻塞問題剖析

你是否在高并發場景下遇到過這種情況&#xff1a;系統性能本來不錯&#xff0c;但在請求量大增的時刻&#xff0c;連接延遲暴漲&#xff0c;響應時間直線飆升&#xff0c;甚至整個服務都變得不可用&#xff1f;當你打開監控時&#xff0c;CPU、內存、帶寬都在正常范圍內&#x…

Web學習筆記4

CSS概述1、CSS簡介CSS&#xff0c;層疊樣式表&#xff0c;是一種樣式表語言&#xff0c;用以描述HTML的呈現內容的方式&#xff08;美化網頁&#xff09;。CSS書寫規則是&#xff1a;選擇器{屬性名&#xff1a;屬性值}的鍵值對CSS有三種引入方式&#xff0c;分別為&#xff1a;…

Spring AI 初學者指南:從入門到實踐與常用大模型介紹

作為 Java 開發者&#xff0c;當 AI 浪潮席卷而來時&#xff0c;如何在熟悉的 Spring 生態中快速擁抱大模型開發&#xff1f;Spring AI 的出現給出了答案。本文將從初學者視角出發&#xff0c;帶你了解 Spring AI 的核心概念、使用方法&#xff0c;并介紹與之搭配的常用大模型&…

C#自定義控件

1。C#中控件和組件的區別&#xff1a; 一般組件派生于&#xff1a;Component類&#xff0c;所以從此類派生出的稱之為組件。 一般用戶控件派生于:Control類或UserControl類&#xff0c;所以從該類派生出的稱之為用戶控件。 他們之間的關系主要是&#xff1a;UserControl繼承Con…

網絡資產測繪工具全景解析:七大平臺深度洞察

?一、資產測繪工具的核心價值?網絡資產測繪&#xff08;Cyber Asset Intelligence&#xff09;技術通過主動掃描與被動分析&#xff1a;實時發現全球暴露的網絡設備&#xff08;服務器、攝像頭、IoT設備&#xff09;自動化構建資產指紋庫&#xff08;操作系統/服務/框架版本&…

編程語言設計目的與側重點全解析(主流語言深度總結)

編程語言的設計本質上是對計算邏輯的形式化表達與工程約束的平衡&#xff0c;不同語言因目標場景、時代需求和技術哲學的差異&#xff0c;形成了獨特的設計范式。以下從系統級、應用級、腳本/動態、函數式、并發/安全等維度&#xff0c;選取10種最具代表性的編程語言&#xff0…

重學前端003 --- 響應式網頁設計 CSS 顏色

文章目錄文檔聲明head顏色模型div根據在這里 Freecodecamp 實踐&#xff0c;記錄筆記總結。 文檔聲明 在文檔頂部添加 DOCTYPE html 聲明 <!DOCTYPE html>head title 元素為搜索引擎提供了有關頁面的額外信息。 它還通過以下兩種方式顯示 title 元素的內容&#xff1a…

這個Pandas函數可以自動爬取Web圖表

Pandas作為數據科學領域鰲頭獨占的利器&#xff0c;有著豐富多樣的函數&#xff0c;能實現各種意想不到的功能。 作為學習者沒辦法一次性掌握Pandas所有的方法&#xff0c;需要慢慢積累&#xff0c;多看多練。 這次為大家介紹一個非常實用且神奇的函數-read_html()&#xff0…

vLLM與SGLang在自然語言處理領域的技術架構與性能對比研究

隨著大語言模型在工業界和學術界的廣泛應用&#xff0c;高效推理框架的選擇成為自然語言處理領域的關鍵挑戰。vLLM與SGLang作為當前最前沿的推理優化框架&#xff0c;分別通過創新的PagedAttention和RadixAttention機制展現了獨特的技術優勢。本文將系統對比兩大框架的核心架構…

樓宇自動化:Modbus 在暖通空調(HVAC)中的節能控制(二)

Modbus 在 HVAC 節能控制中的應用案例案例一&#xff1a;某商業建筑 HVAC 系統節能改造某大型商業建筑&#xff0c;總建筑面積達 5 萬平方米&#xff0c;涵蓋了購物中心、餐飲區和娛樂場所等多種功能區域 。改造前&#xff0c;其 HVAC 系統采用傳統的控制方式&#xff0c;設備之…