easyexcel 2.2.6版本導出excel模板時,標題帶下拉框及其下拉值過多不顯示問題

需求背景:有一個需求要做下拉框的值有100多條,同時這個excel是一個多sheet的導入模板
直接用easyexcel 導出,會出現下拉框的值過多,導致生成出來的excel模板無法正常展示下拉功能

?

使用的easyexcel版本:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>
自定義處理器package com.manager.utils;import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.util.Map;/*** 解決使用 easyExcel導出模板,下拉框數據超長,導出模板后,下拉框數據不展示問題* @author yjj* @date 2025/02/18 10:16**/
public class EasyExcelCellWriteHandler implements SheetWriteHandler {public static final String SHEET_NAME = "下拉框隱藏表hidden";/*** 設置閾值,避免生成的導入模板下拉值獲取不到*/private static final Integer LIMIT_NUMBER = 50;private Map<Integer, String[]> map = null;public EasyExcelCellWriteHandler(Map<Integer, String[]> map) {this.map = map;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {// 這里可以對cell進行任何操作Sheet sheet = writeSheetHolder.getSheet();DataValidationHelper helper = sheet.getDataValidationHelper();Class<?> headClass = writeSheetHolder.getClazz();// k 為存在下拉數據集的單元格下表 v為下拉數據集map.forEach((k, v) -> {System.out.println("Key = " + k + ", Value = " + v);// 設置下拉單元格的首行 末行 首列 末列CellRangeAddressList rangeList = new CellRangeAddressList(EasyExcelUtils.headRowNumber(headClass), 65536,k,k);// 如果下拉值總數大于50,則使用一個新sheet存儲,避免生成的導入模板下拉值獲取不到if (v.length > LIMIT_NUMBER) {//定義sheet的名稱//1.創建一個隱藏的sheet 名稱為 hidden + kString sheetName = SHEET_NAME +sheet.getSheetName() + k;Workbook workbook = writeWorkbookHolder.getWorkbook();Sheet hiddenSheet = workbook.createSheet(sheetName);for (int i = 0, length = v.length; i < length; i++) {// 開始的行數i,列數khiddenSheet.createRow(i).createCell(k).setCellValue(v[i]);}Name category1Name = workbook.createName();category1Name.setNameName(sheetName);String excelLine = getExcelLine(k);// =hidden!$H:$1:$H$50  sheet為hidden的 H1列開始H50行數據獲取下拉數組String refers = "=" + sheetName + "!$" + excelLine + "$1:$" + excelLine + "$" + (v.length + 1);// 將剛才設置的sheet引用到你的下拉列表中DataValidationConstraint constraint = helper.createFormulaListConstraint(refers);DataValidation dataValidation = helper.createValidation(constraint, rangeList);writeSheetHolder.getSheet().addValidationData(dataValidation);// 設置存儲下拉列值得sheet為隱藏int hiddenIndex = workbook.getSheetIndex(sheetName);if (!workbook.isSheetHidden(hiddenIndex)) {workbook.setSheetHidden(hiddenIndex, true);}}// 下拉列表約束數據DataValidationConstraint constraint = helper.createExplicitListConstraint(v);// 設置約束DataValidation validation = helper.createValidation(constraint, rangeList);// 阻止輸入非下拉選項的值validation.setErrorStyle(DataValidation.ErrorStyle.STOP);validation.setShowErrorBox(true);validation.setSuppressDropDownArrow(true);validation.createErrorBox("提示", "此值與單元格定義格式不一致");// validation.createPromptBox("填寫說明:","填寫內容只能為下拉數據集中的單位,其他單位將會導致無法入倉");sheet.addValidationData(validation);});}/*** 返回excel列標A-Z-AA-ZZ** @param num 列數* @return java.lang.String*/private String getExcelLine(int num) {String line = "";int first = num / 26;int second = num % 26;if (first > 0) {line = (char) ('A' + first - 1) + "";}line += (char) ('A' + second) + "";return line;}}
導出工具類/*** 支持超長下拉框展示* 下載導入模板 - 支持多sheet*/public static void writeTemplateBoxTooLong(HttpServletResponse response, ExcelModel excelModel) {ExcelWriter excelWriter = null;try {excelWriter = EasyExcel.write(outputStream(excelModel.getFileName(), response)).registerConverter(new DateConverter()).useDefaultStyle(false).build();List<ExcelModel.Sheet<?>> sheets = excelModel.getSheets();for (int i = 0; i < sheets.size(); i++) {ExcelModel.Sheet<?> sheet = sheets.get(i);WriteSheet writeSheet;if (ExtraOption.class.isAssignableFrom(sheet.getHeadClass())) {writeSheet = EasyExcel.writerSheet(i, sheet.getSheetName()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(HorizontalCellStyleStrategyFactory.optStyleStrategy()).head(sheet.getHeadClass()).sheetName(sheet.getSheetName()).build();} else {Map<Integer, String[]> map = buildExcelDropDownSetField(sheet.getHeadClass());writeSheet = EasyExcel.writerSheet(i, sheet.getSheetName()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(new EasyExcelCellWriteHandler(map)).registerWriteHandler(new ImportTempleRowWriteHandler()).registerWriteHandler(new ImportTempleCellWriteHandler()).head(sheet.getHeadClass()).sheetName(sheet.getSheetName()).relativeHeadRowIndex(RELATIVE_HEAD_ROW_INDEX).includeColumnFiledNames(sheet.getIncludeFiledNames()).build();}excelWriter.write(sheet.getData(), writeSheet);}} catch (Exception e) {Throwable cause = Throwables.getRootCause(e);log.error("下載模板失敗:{}", cause.getMessage(), cause);throw new ServiceException("下載模板失敗:{0}", cause.getMessage());} finally {if (excelWriter != null) {excelWriter.finish();}}}
 /*** 批量導入 - 支持多sheet*/@SuppressWarnings("rawtypes")public static Map<Class<?>, List<?>> readMultiSheet(MultipartFile file, Class<?>... classes) {Map<Class<?>, List<?>> resultMap = Maps.newHashMapWithExpectedSize(classes.length + 1);try {checkExcelFile(file);ByteArrayInputStream inputStream = deleteHiddenSheets(file);ExcelReader excelReader = EasyExcel.read(inputStream).build();for (int i = 0; i < classes.length; i++) {Class clazz = classes[i];SimpleAnalysisEventListener listener = SimpleAnalysisEventListener.factory(true);ReadSheet readSheet = EasyExcel.readSheet(i).head(clazz).registerReadListener(listener).headRowNumber(headRowNumber(clazz)).build();excelReader.read(readSheet);resultMap.put(clazz, listener.getResults());}if (resultMap.values().stream().allMatch(CollectionUtils::isEmpty)) {throw new ServiceException("請至少錄入一條數據");}} catch (Exception e) {Throwable cause = Throwables.getRootCause(e);log.error("解析異常:{}", cause.getMessage(), cause);throw new ServiceException("解析異常:{0}", cause.getMessage());}return resultMap;}//刪除導出模板時生成的隱藏sheet,避免導入時讀取帶隱藏sheet報錯public static ByteArrayInputStream deleteHiddenSheets(MultipartFile file){try (InputStream inputStream = file.getInputStream();ByteArrayOutputStream outputStream = new ByteArrayOutputStream();){Workbook workbook = new XSSFWorkbook(inputStream);for (int i = 0; i < workbook.getNumberOfSheets(); i++) {Sheet sheet = workbook.getSheetAt(i);if (sheet.getSheetName().contains(EasyExcelCellWriteHandler.SHEET_NAME)) {workbook.removeSheetAt(i);i--;  // 因為刪除了一個sheet,索引需要調整}}workbook.write(outputStream);workbook.close();return new ByteArrayInputStream(outputStream.toByteArray());} catch (IOException e) {log.error("解析excel失敗!",e);throw new ServiceException("解析失敗!");}}

原生poi參考這位大佬:解決POI的SXSSFSheet 創建excel下拉框,下拉框內容過多時不顯示的問題_java poi 下拉框數據7萬行,隱藏sheet方法也看不不全-CSDN博客

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

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

相關文章

基于WebRTC與AI大模型接入EasyRTC:打造輕量級、高實時、強互動的嵌入式音視頻解決方案

隨著物聯網和嵌入式技術的快速發展&#xff0c;嵌入式設備對實時音視頻通信的需求日益增長。然而&#xff0c;傳統的音視頻解決方案往往存在體積龐大、實時性差、互動體驗不佳等問題&#xff0c;難以滿足嵌入式設備的資源限制和應用場景需求。 針對以上痛點&#xff0c;本文將介…

AI工作流+專業知識庫+系統API的全流程任務自動化

我有點悲觀&#xff0c;甚至很沮喪&#xff0c;因為AI留給普通人的機會不多了&#xff0c;這既是人類之間權力的斗爭&#xff0c;也是硅基生命和碳基生命的斗爭。AI自動化是無法避免的趨勢&#xff0c;如果人類不能平權&#xff0c;那就只能跪下接受審判。 通過整合AI工作流、專…

Lua | 每日一練 (3)

&#x1f4a2;歡迎來到張胤塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 Lua | 每日一練 (3)題目參考答案減少查找次數預分配表…

二叉樹(中等題)

1、先序&#xff0c;中序遍歷確定二叉樹 105 方法一、 前提 ① 必須不能有重復元素② 只有先序&#xff0b;中序和后序&#xff0b;中序才能實現唯一樹 思考要點&#xff1a; 不要想著用for循環&#xff0c;遞歸一定更好解決輸入是vector&#xff0c;遞歸就得考慮傳入索…

服務器通過 ollama 運行deepseek r1

1、服務器環境簡介 56核 CPU64G 內存無顯卡已安裝 Ollama 2、下載模型與配置 正常可以通過 ollama pull 或 ollama run 命令直接下載&#xff0c;但通常會遇到連接超時、找不到網址等總理。因此&#xff0c;可以使用國內的模型站進行下載&#xff0c;在這里使用魔塔查找模型…

java項目排查線上問題1111

1.磁盤容量不足&#xff1a; 應用拋出的異常信息&#xff1a;java.io.IOException: 磁盤空間不足 1.1 指令獲取磁盤狀態&#xff1a;df -h 1.2 獲取目錄下文件夾大小&#xff1a;du -sh * 1.3 獲取目錄下文件夾大小&#xff1a;ls -lh 可以找到最大的文件&#xff0c;如日…

js中 ES6 新特性詳解

ES6&#xff08;ECMAScript 2015&#xff09;是 JavaScript 的一次重大更新&#xff0c;引入了許多新的特性&#xff0c;使 JavaScript 代碼更加簡潔、可讀和高效。以下是 ES6 的主要新特性及其原理 1. let 和 const 關鍵字 原理解析 1.1 作用域 var 關鍵字的作用域&#xf…

深入理解設計模式之解釋器模式

深入理解設計模式之解釋器模式 在軟件開發的復雜世界中,我們常常會遇到需要處理特定領域語言的情況。比如在開發一個計算器程序時,需要解析和計算數學表達式;在實現正則表達式功能時,要解析用戶輸入的正則表達式來匹配文本。這些場景都涉及到對特定語言的解釋和執行,而解…

巧妙實現右鍵菜單功能,提升用戶操作體驗

在動態交互式圖庫中&#xff0c;右鍵菜單是一項能夠顯著提升用戶操作便捷性的功能。它的設計既要響應用戶點擊位置&#xff0c;又需確保菜單功能與數據操作緊密結合&#xff0c;比如刪除圖片操作。以下將通過一段實際代碼實現&#xff0c;展示從思路到實現的詳細過程。 實現右鍵…

??????????????如何使用函數指針來調用函數

在C和C編程中&#xff0c;函數指針是一種特殊類型的指針&#xff0c;它指向一個函數而不是一個變量。使用函數指針可以動態地調用不同的函數&#xff0c;這在實現回調函數、事件處理、策略模式等場景中非常有用。 以下是如何定義和使用函數指針來調用函數的步驟&#xff1a; 定…

KEGG條形圖繪制

原始數據 setwd("C:\\Users\\HUAWEI\\Desktop\\proteomic_WGCNA\\bacteria\\Eggnog\\KEGGhun") library(ggplot2) library(cols4all) dt <- read.csv("bacteria_KEGG.csv")dt$KEGG_Term <- factor(dt$KEGG_Term, levels rev(dt$KEGG_Term))#基礎富集…

My Metronome for Mac v1.4.2 我的節拍器 支持M、Intel芯片

應用介紹 My Metronome 是一款適用于 macOS 的專業節拍器應用程序&#xff0c;旨在幫助音樂家、作曲家、學生和任何需要精確節奏控制的人進行練習。無論是進行樂器練習、音樂創作還是演出排練&#xff0c;My Metronome 都能為用戶提供精準的節拍支持和靈活的功能&#xff0c;確…

宇樹科技13家核心零部件供應商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;發布最新人形機器人研報&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形機器人100&#xff1a;全球人形機器人產業鏈梳理&#xff09;。 Humanoid 100清單清單中…

Part 3 第十二章 單元測試 Unit Testing

概述 第十二章圍繞單元測試展開&#xff0c;闡述了單元測試的實踐與重要性&#xff0c;通過對比其他測試類型&#xff0c;突出其特點&#xff0c;還介紹了單元測試的最佳實踐、避免的反模式以及與測試替身相關的內容&#xff0c;為編寫高質量單元測試提供指導。 章節概要 1…

【Vite SVG 圖標方案:vite-plugin-svg-icons 指南】

&#x1f31f; Vite SVG 圖標方案&#xff1a;vite-plugin-svg-icons 指南 &#x1f4dc; 背景與痛點 &#x1f30d; 前端圖標演進史 1.0 &#x1f5bc;? 圖片圖標 → 2.0 &#x1f3ad; 字體圖標 → 3.0 &#x1f3a8; SVG 圖標傳統方案存在三大痛點&#xff1a; 字體圖標…

go flag參數 類似Java main 的args

兩部分內容 go run test1.go aa -name 123 1. 解析&#xff1a;aa -name 123 2. 解析&#xff1a;name 123 代碼 package mainimport ("log""os" )func main() {log.Println("main ...")if len(os.Args) > 0 {for index, arg : ra…

酒店旅游API:數據交互的隱形橋梁——以攜程API為例

一、API&#xff1a;酒店 和第三方服務無縫連接。 核心價值&#xff1a; 實時數據互通&#xff1a;房態、價格、庫存秒級同步。業務流程自動化&#xff1a;預訂、支付、確認全程無需人工干預。生態擴展&#xff1a;開發者可基于API構建定制化工具&#xff08;如比價插件、智能…

深入理解 JSP 與 Servlet:原理、交互及實戰應用

一、引言 在 Java Web 開發領域,JSP(JavaServer Pages)和 Servlet 是兩個至關重要的技術,它們共同構成了動態網頁開發的基礎。Servlet 作為服務器端的 Java 程序,負責處理客戶端請求并生成響應;而 JSP 則是一種簡化的 Servlet 開發方式,允許開發者在 HTML 頁面中嵌入 J…

【JavaScript】《JavaScript高級程序設計 (第4版) 》筆記-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 隨著 Web 瀏覽器能力的增加&#xff0c;其復雜性也在迅速增加。從很多方面看&#xff0c;現代 Web 瀏覽器已經成為構建于諸多規范之上、集不同 API 于一身的“瑞士軍刀”。瀏覽器規范的生態在某種程度上是混亂而無序的。一些規范如 HTML5&…

AI芯片的關鍵特征

AI芯片是專門為人工智能應用設計的芯片&#xff0c;以下是其應具備的關鍵特征&#xff1a; 強大的并行計算能力&#xff1a;AI任務如深度學習中的神經網絡訓練和推理&#xff0c;涉及大量矩陣運算和并行數據處理。AI芯片需有眾多計算單元&#xff08;如GPU的大量流處理器、ASIC…