Excel导出下拉方案调整

This commit is contained in:
2025-10-24 11:07:59 +08:00
parent 1bcd07c0c8
commit 33675312cd
3 changed files with 50 additions and 4 deletions

View File

@@ -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<Integer, List<String>> dropDownData;
public CustomSheetWriteHandler(Map<Integer, List<String>> 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<Integer, List<String>> 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);
}
}
}
}

View File

@@ -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这里假设第一行为表头

View File

@@ -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();