From 33675312cd1741ab6dba55f0a4fa02befe941162 Mon Sep 17 00:00:00 2001 From: juncaiq Date: Fri, 24 Oct 2025 11:07:59 +0800 Subject: [PATCH] =?UTF-8?q?Excel=E5=AF=BC=E5=87=BA=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=96=B9=E6=A1=88=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/CustomSheetWriteHandler.java | 39 ++++++++++++++++++- .../handler/RowFormatSetTextHandler.java | 11 +++++- .../excel/write/ExcelExportUtils.java | 4 +- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/CustomSheetWriteHandler.java b/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/CustomSheetWriteHandler.java index 33dd2a3..fa636a4 100644 --- a/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/CustomSheetWriteHandler.java +++ b/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/CustomSheetWriteHandler.java @@ -5,8 +5,19 @@ package com.jeelowcode.framework.excel.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 org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; /** * @@ -15,6 +26,12 @@ public class CustomSheetWriteHandler implements SheetWriteHandler { private static final Integer COLUMN = 26; + private Map> dropDownData; + + public CustomSheetWriteHandler(Map> dropDownData){ + this.dropDownData = dropDownData; + } + @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { for (int i = 0; i < COLUMN; i++) { @@ -26,5 +43,25 @@ public class CustomSheetWriteHandler implements SheetWriteHandler { // i为列,一整列设置为文本格式 sxssfSheet.setDefaultColumnStyle(i, cellStyle); } + + for (Map.Entry> entry : dropDownData.entrySet()){ + if(entry.getValue().size()>=10){ + String[] selectValues = entry.getValue().toArray(new String[entry.getValue().size()]); + /* 解决办法从这里开始 */ + //获取一个workbook + Workbook workbook = writeWorkbookHolder.getWorkbook(); + //定义sheet的名称 + String hiddenName = "hidden"+entry.getKey(); + //1.创建一个隐藏的sheet 名称为 hidden + Sheet hidden = workbook.createSheet(hiddenName); + //2.循环赋值(为了防止下拉框的行数与隐藏域的行数相对应,将隐藏域加到结束行之后) + for (int i = 0, length = selectValues.length; i < length; i++) { + // 3:表示你开始的行数 3表示 你开始的列数 + hidden.createRow( i).createCell(0).setCellValue(selectValues[i]); + } + workbook.setSheetHidden(workbook.getSheetIndex(hidden), true); + } + } } + } diff --git a/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/RowFormatSetTextHandler.java b/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/RowFormatSetTextHandler.java index 006c8d7..686be3d 100644 --- a/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/RowFormatSetTextHandler.java +++ b/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/handler/RowFormatSetTextHandler.java @@ -81,6 +81,7 @@ public class RowFormatSetTextHandler implements CellWriteHandler { cellData.setOriginCellStyle(cellStyle); } + /** * 单元格样式 */ @@ -110,7 +111,15 @@ public class RowFormatSetTextHandler implements CellWriteHandler { String[] dropdownOptionsArray = dropdownOptionList.toArray(new String[0]); // 创建下拉列表的约束 - DataValidationConstraint constraint = helper.createExplicitListConstraint(dropdownOptionsArray); + DataValidationConstraint constraint;//= helper.createExplicitListConstraint(dropdownOptionsArray); + if (dropdownOptionsArray.length < 10) { + // 直接设置下拉选 + constraint = helper.createExplicitListConstraint(dropdownOptionsArray); + } else { + // 联动到另外一个 sheet + //这里如果识别到大于等于10行不管数据量有多少 + constraint = helper.createFormulaListConstraint("hidden"+firstCol+"!$A$1:$A$"+dropdownOptionList.size()); + } // 设置下拉列表应用的单元格区域,例如第2行到最后一行的第2列 int firstRow = 1; // 通常Excel中第一行是1,这里假设第一行为表头 diff --git a/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/write/ExcelExportUtils.java b/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/write/ExcelExportUtils.java index 41bad78..523d8b4 100644 --- a/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/write/ExcelExportUtils.java +++ b/jeelowcode-framework/jeelowcode-excel/src/main/java/com/jeelowcode/framework/excel/write/ExcelExportUtils.java @@ -93,7 +93,7 @@ public class ExcelExportUtils { rowFormatSetTextHandler.setDropdownOptionsMap(dropdownOptionsMap); EasyExcel.write(response.getOutputStream()) .registerWriteHandler(rowFormatSetTextHandler) - .registerWriteHandler(new CustomSheetWriteHandler())// 初始化单元格为文本格式 + .registerWriteHandler(new CustomSheetWriteHandler(dropdownOptionsMap))// 初始化单元格为文本格式 .registerWriteHandler(new CustomColumnWidthStyleStrategy())// 单元格宽度 .registerWriteHandler(CellStyleUtils.getCellStyleStrategy())// 单元格样式 .head(head) @@ -145,7 +145,7 @@ public class ExcelExportUtils { WriteSheet writeSheet = EasyExcel.writerSheet(sheetName) .head(head) .registerWriteHandler(rowFormatSetTextHandler) - .registerWriteHandler(new CustomSheetWriteHandler()) + .registerWriteHandler(new CustomSheetWriteHandler(dropdownOptionsMap)) .registerWriteHandler(new CustomColumnWidthStyleStrategy()) .registerWriteHandler(CellStyleUtils.getCellStyleStrategy()) .build();