easyexcel導出動態標題,以及動態設置下拉選擇,并設置下拉選擇校驗

目錄

1.說明

2.示例

3.總結


1.說明

平時使用easyexcel進行導出時,標題的名字通過在表的實體類上添加注解的方式進行實現,然后傳入表的實體類的集合進行下載即可。

有這么一個需求,用戶可以自定義導出的模板,也就是說導出的模板的列信息時變化的,并且要根據對應的列信息實現列的下拉選擇。

2.示例

easyexcel版本

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

service

            List<String> colId = dowDomain.getColId();// 獲取列的詳細信息List<ColEntryEntity> colList = colEntryMsapi.getColList(colId);// 生成標題List<List<String>> heads = new ArrayList<>();colList.forEach(item -> {heads.add(Arrays.asList(item.getDisplayName(), item.getColId(), item.getDbName()));});// list類型的列生成下拉選擇List<String> listColIdList = colList.stream().filter(item -> ColumnTypeEnum.LIST.type.equals(item.getColType())).map(ColEntryEntity::getColId).collect(Collectors.toList());List<ColEntryListEntity> colValList = new ArrayList<>();if (CollUtil.isNotEmpty(listColIdList)) {colValList = colEntryMsapi.getColValList(listColIdList);}Map<Integer, List<String>> valList = new HashMap<>();for (int i = 0; i < colList.size(); i++) {ColEntryEntity colEntry = colList.get(i);if (ColumnTypeEnum.LIST.type.equals(colEntry.getColType())) {List<String> list = colValList.stream().filter(x -> x.getColId().equals(colEntry.getColId())).map(ColEntryListEntity::getListValue).collect(Collectors.toList());valList.put(i, list);}}domain.setHeads(heads);domain.setValList(valList);return domain;

controller?

        String fileName = "導入模板" + DateFormatUtils.format(new Date(), CommonContants.DATE_TYPE) + CommonContants.TYPE_XLSX;response.setContentType(CommonContants.CONTENT_TYPE);response.setCharacterEncoding(CommonContants.UTF8);response.setHeader(Header.CONTENT_DISPOSITION.getValue(), CommonContants.CONTENT_TYPE + URLEncoder.encode(fileName, CommonContants.UTF8));DowloadDomain dowloadDomain = attributeCustomizeService.dowloadTemplate(dowDomain);List<List<Object>> total = new ArrayList<>();EasyExcel.write(response.getOutputStream()).head(dowloadDomain.getHeads()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(new CustomSheetWriteHandler(dowloadDomain.getValList())).sheet("模板").doWrite(total);

?通過自定義攔截器實現下拉選擇

package com.kingagroot.info.handler;import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;import java.util.*;/*** 自定義攔截器.對第一列第一行和第二行的數據新增下拉框,顯示 測試1 測試2** @author Jiaju Zhuang*/
@Slf4j
public class CustomSheetWriteHandler implements SheetWriteHandler {private Map<Integer, List<String>> optionGroupMap;public CustomSheetWriteHandler(Map<Integer, List<String>> mapList) {Map<Integer, List<String>> data = new HashMap<>(mapList);optionGroupMap = data;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}/*** 自定義攔截器.填充下拉選項 key 就是 第幾列(從0開始),value 就是這一列 你的下拉數據*/@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Sheet sheet = writeSheetHolder.getSheet();// 區間設置 第一列第一行和第二行的數據。由于第一行是頭,所以第一、二行的數據實際上是第二三行Optional.ofNullable(optionGroupMap).orElse(new HashMap<>()).forEach((columnIndex, options) -> {// 區間設置 第一列第一行和第二行的數據。由于第一行是頭,所以第一、二行的數據實際上是第二三行CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(3, 65535, columnIndex, columnIndex);DataValidationHelper helper = sheet.getDataValidationHelper();DataValidationConstraint constraint = helper.createExplicitListConstraint(options.toArray(new String[options.size()]));DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);// 這行代碼是用于設置數據驗證時是否顯示錯誤提示框的,為true,如果用戶在單元格中輸入了不符合數據驗證條件的數值,會彈出提示dataValidation.setShowErrorBox(true);// 這行代碼是用于設置數據驗證中的錯誤提示框的樣式。當設置為DataValidation.ErrorStyle.STOP時,表示如果用戶輸入了不符合數據驗證條件的數值,將阻止用戶繼續輸入并彈出錯誤提示框,防止不合規范的數據被輸入。dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);// 這行代碼表示設置數據驗證時是否允許空單元格。當將參數設置為false時,即不允許空單元格// dataValidation.setEmptyCellAllowed(false);// 這行代碼表示設置數據驗證時是否顯示下拉箭頭。當將參數設置為false時,會在具有數據驗證的單元格中顯示下拉箭頭,以提示用戶可以從預定義的選項中進行選擇。如果設置為true,則不會顯示下拉箭頭。// dataValidation.setSuppressDropDownArrow(false);// 這行代碼表示設置數據驗證時是否顯示提示框。當將參數設置為true時,如果用戶選擇了擁有數據驗證的單元格,會彈出一個提示框,向用戶提供關于該單元格數據輸入的指導或說明// dataValidation.setShowPromptBox(true);// 這行代碼是用于創建數據驗證的錯誤提示框。其中,第一個參數"錯誤"表示錯誤提示框的標題,第二個參數"請從下拉列表中選擇一個選項!"是具體的錯誤提示信息。當用戶輸入了不符合數據驗證條件的數值時,將會彈出這個錯誤提示框,提醒用戶輸入的數據不符合規定,并給出相應的錯誤說明。dataValidation.createErrorBox("錯誤", "請從下拉列表中選擇一個選項!");// 這行代碼用于設置數據驗證的標題和提示信息。第一個參數"下拉選擇限制"表示數據驗證對話框的標題,第二個參數"請在下拉列表中選擇一個選項!"是具體的提示信息。當用戶在單元格輸入了不符合數據驗證條件的數值時,會彈出一個警告框,其中包含了設置的標題和提示信息,以提醒用戶必須從下拉列表中進行選擇。// 有的版本可能沒有這個設置,需要升級到對應的版本// dataValidation.setTitle("下拉選擇限制", "請在下拉列表中選擇一個選項!");writeSheetHolder.getSheet().addValidationData(dataValidation);});}
}

說明

?①獲取要下載模板中的列信息,生成標題,代碼如下:

            // 生成標題List<List<String>> heads = new ArrayList<>();colList.forEach(item -> {heads.add(Arrays.asList(item.getDisplayName(), item.getColId(), item.getDbName()));});

?動態標題的信息需要存儲到一個List<List<String>>集合中,集合中的數據是一個string類型的集合,代表第一列標題的信息,上面中每列標題中存儲了3個值,代表每列的標題行有3行。通過循環處理生成導出文件的標題。

②動態下拉的實現

? 要做到哪一列可以進行下拉選擇,哪一列沒有下拉選擇,首先要獲取下拉選擇列表,循環列信息,進行匹配,存儲到Map<Integer, List<String>>集合中,key代表是哪一列,從0開始,value則代表下拉選擇列表。

然后通過上面的自定義攔截器,將集合內容傳遞到攔截器中進行循環處理,設置下拉選擇

使用了Optional.ofNullable(optionGroupMap).orElse(new HashMap<>())方法進行處理避免空指針的問題。

③下拉選擇輸入內容不正確時可以進行校驗處理,主要是下面這三行代碼,分別是開啟數據驗證,輸入錯誤時阻止輸入并彈出信息以及彈出信息的內容設置

            // 這行代碼是用于設置數據驗證時是否顯示錯誤提示框的,為true,如果用戶在單元格中輸入了不符合數據驗證條件的數值,會彈出提示dataValidation.setShowErrorBox(true);// 這行代碼是用于設置數據驗證中的錯誤提示框的樣式。當設置為DataValidation.ErrorStyle.STOP時,表示如果用戶輸入了不符合數據驗證條件的數值,將阻止用戶繼續輸入并彈出錯誤提示框,防止不合規范的數據被輸入。dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);// 這行代碼是用于創建數據驗證的錯誤提示框。其中,第一個參數"錯誤"表示錯誤提示框的標題,第二個參數"請從下拉列表中選擇一個選項!"是具體的錯誤提示信息。當用戶輸入了不符合數據驗證條件的數值時,將會彈出這個錯誤提示框,提醒用戶輸入的數據不符合規定,并給出相應的錯誤說明。dataValidation.createErrorBox("錯誤", "請從下拉列表中選擇一個選項!");

④導出數據的設置

?格式為List<List<Object>> ,集合中的每條數據代表一行數據,注意順序要和列一一對應。

3.總結

自定義導出模板,注意標題的設置,下拉選擇的設置及內容的設置

不同的easyexcel的版本,在下拉選擇的設置存在不同,使用時需要注意

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

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

相關文章

南京沁恒微USB HUB CH334/CH335多種封裝規格選擇,外圍簡單,價格還美麗

概述&#xff1a; CH334 和 CH335 是符合 USB2.0 協議規范的 全速&#xff0c;下行端口支持 USB2.0 高速 480Mbps 個 TT 分時調度 4 個下行端口&#xff09;&#xff0c;還支持高性能的 工業級設計&#xff0c;外圍精簡&#xff0c;可應用于計算機和工控機主板 特點&#xff1…

精品UI響應式視頻教程知識付費系統源碼在線教育網絡課程在線點播可二開分銷分站功能

這是一款知識付費平臺模板&#xff0c;后臺可上傳本地視頻&#xff0c;批量上傳視頻連接&#xff0c; 視頻后臺可設計權限觀看&#xff0c;免費試看時間時長&#xff0c;會員等級觀看&#xff0c;付費觀看等功能&#xff0c; 也帶軟件app權限下載&#xff0c;幫助知識教育和軟件…

域名郵箱是什么?怎么注冊公司的域名郵箱?

擁有一個專業、獨特的郵箱地址不僅能提升企業形象&#xff0c;還能增強客戶信任感。域名郵箱是什么&#xff1f;域名郵箱也稱為企業郵箱或定制郵箱&#xff0c;是一種基于企業自主域名設置的電子郵件服務。本文將詳細介紹域名郵箱的概念、優勢以及如何注冊公司的域名郵箱 一、…

事務的ACID是什么及扁平化事務、鏈式事務

一、什么是事務 1.事務&#xff08;Transaction)是區別于數據庫文件系統的重要特性之一。事務會把數據庫從一種一致狀態轉換為另一種一致狀態。在數據庫提交工作時&#xff0c;可以確保要么所有修改都已經保存&#xff0c;要么所有修改都不保存。 2.InnoDB存儲引擎中的事物完…

WPF實現搜索文本高亮

WPF實現搜索文本高亮 1、使用自定義的TextBlock public class HighlightTextblock : TextBlock{public string DefaultText { get; set; }public string HiText{get { return (string)GetValue(HiTextProperty); }set { SetValue(HiTextProperty, value); }}// Using a Depend…

31.@Anonymous

1?@Anonymous原理 大家應該已經習慣我的教學套路,很多時候都是先使用,然后講述原理。 上節課我們使用了注解@Anonymous,然后接口就可以直接被訪問到了,不用token!不用token!不用token!。 我們一般知道,注解是給程序看的,給機器看的,當然也是給程序員看的。注解如果…

詳解HTML

目錄 1.HTML 結構 1.1認識HTML標簽 1.2標簽層次結構 1.3快速生成代碼框架 2.HTML常見標簽 2.1注釋標簽 2.2標題標簽&#xff1a;h1-h6 2.3段落標簽&#xff1a;p 2.4換行標簽&#xff1a;br 2.5格式化標簽 2.6圖片標簽&#xff1a;img 2.7超鏈接標簽 2.8表格標簽…

全域運營是本地生活的下半場?新的創業風口來了?

隨著全域概念的興起&#xff0c;全域運營賽道也逐漸進入人們的視野之中&#xff0c;甚至有業內人士預測&#xff0c;全域運營將會是本地生活下半場的大趨勢。 之所以這么說&#xff0c;是因為全域運營作為包含了公域和私域內所有運營業務的新模式&#xff0c;不僅能同時做所有本…

設計模式-解釋器模式

作者持續關注 WPS二次開發專題系列&#xff0c;持續為大家帶來更多有價值的WPS開發技術細節&#xff0c;如果能夠幫助到您&#xff0c;請幫忙來個一鍵三連&#xff0c;更多問題請聯系我&#xff08;QQ:250325397&#xff09; 定義 解釋器模式&#xff08;Interpreter Pattern&…

vue3 組件刷新

在 Vue 3 中&#xff0c;如果你想刷新一個組件&#xff0c;有幾種方法可以實現。 使用 key 屬性: 當你想要強制重新渲染一個組件時&#xff0c;你可以為其添加一個獨特的 key 屬性。當 key 屬性的值改變時&#xff0c;Vue 會強制組件重新創建。 <template> <MyComp…

jQuery 中的toggleClass應用 (含代碼)

直接上代碼 <!DOCTYPE html> <html><head><style>.info {color: green;}</style></head><body><input type"button" value"點擊" onclick"changeClass()" /><div id"x1">例子…

第十五屆藍橋杯國賽前的問題記錄

文章目錄 遇到的問題問題解析1.生成m-n的隨機數&#xff0c;包括倆個數在內2.fetch解析后如何獲取結果3.獲取多選下拉框&#xff08;select標簽設置multiple屬性&#xff09;的值4.如何刪除某個獲取到的節點5.vue中遇到多選下拉框如何處理 小結 遇到的問題 生成m-n的隨機數fet…

(delphi11最新學習資料) Object Pascal 學習筆記---第12章第3節 ( RTL 中的類引用 )

12.3.1 RTL 中的類引用** ? System 單元和其他核心 RTL 單元聲明了許多類引用&#xff0c;包括以下幾種&#xff1a; TClass class of TObject; ExceptClass class of Exception; TComponentClass class of TComponent; TControlClass class of TControl; TFormClass c…

Nginx企業級負載均衡:技術詳解系列(9)—— Nginx核心配置詳解(全局配置)

你好&#xff0c;我是趙興晨&#xff0c;97年文科程序員。????? 在 Nginx企業級負載均衡&#xff1a;技術詳解系列&#xff08;8&#xff09;—— Nginx核心配置詳解&#xff08;默認配置文件&#xff09;文章中&#xff0c;咱們討論了Nginx核心配置文件的基礎知識&#…

【Python設計模式11】建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一種創建型設計模式&#xff0c;它將一個復雜對象的構建過程分離出來&#xff0c;使得同樣的構建過程可以創建不同的表示。建造者模式通過使用多個簡單的對象一步一步構建成一個復雜的對象。 建造者模式的結構 建造者模式…

centos9 stream在線安裝NVIDIA驅動(rockylinux9.4也成功安裝nvidia驅動)

Install NVIDIA Drivers on CentOS Stream 9&#xff08;rockylinux9.4成功&#xff09; 主板為技嘉mz72-hb2 顯卡為4090 一.Disable Secure Boot From the BIOS 二.Enabling the EPEL Repository on CentOS Stream 9 1.update the DNF package repository cache sudo dnf …

STM32控制HC-SR04超聲模塊獲取距離

歡迎入群共同學習交流 時間記錄&#xff1a;2024/5/23 一、模塊介紹 &#xff08;1&#xff09;引腳介紹 VCC&#xff1a;電源引腳&#xff0c;接單片機3.3/5V GND&#xff1a;電源地 Trig&#xff1a;超聲信號觸發引腳 Echo&#xff1a;超聲信號接收引腳 &#xff08;2&…

java.util.Arrays 詳解

排序 sort(int[] a): 對指定 int 型數組按數字升序進行排序。sort(Object[] a): 對指定對象數組進行排序&#xff08;對象的類必須實現 Comparable 接口&#xff09;。sort(T[] a, Comparator<? super T> c): 使用指定的比較器對數組進行排序。sort(int[] a, int fromI…

給你一把接口響應斷言神器,你要不要?

JSON Schema是用來標記和校驗JSON數據&#xff0c;類似于XMLSchema,可用在自動化測試驗證JSON數據。 官網&#xff1a;http://json-schema.org/ 最常用版本&#xff1a;draft 04。&#xff08;目前各類編程語言對draft 04支持最廣泛&#xff09; 舉個例子 假如你有一個接口…

202473讀書筆記|《但愿呼我的名為旅人:松尾芭蕉俳句300》——圍爐夜話,身頓心安,愿每個人都能在愛里自由馳騁

202473讀書筆記|《但愿呼我的名為旅人&#xff1a;松尾芭蕉俳句300》——圍爐夜話&#xff0c;身頓心安&#xff0c;愿每個人都能在愛里自由馳騁 &#x1f60d;&#x1f60d;&#x1f929;&#x1f929; 譯者序正文二正文三正文四正文五正文六正文七 《但愿呼我的名為旅人&…