解决EasyExcel创建excel下拉框,下拉框内容过多时不显示的问题

新建SpinnerLongHandler类 将内容拷贝过去直接调用即可
.registerWriteHandler(new SpinnerLongHandler(spinnerLongMap,excelDtoList.size()))
如:

//调用方式 Integer为所在列数 , string[]下拉列表的string数组
EasyExcel.write(
response.getOutputStream(), Students.class)
.registerWriteHandler(new SpinnerLongHandler(spinnerLongMap,excelDtoList.size()))
			.sheet("管理").doWrite(excelDtoList);

新建SpinnerLongHandler 继承SheetWriteHandler

public class SpinnerLongHandler implements SheetWriteHandler {

	/**
	 * 下拉框内容map Integer数据所在列数,string[]下拉数据列表
	 */
	private Map<Integer, String[]> spinnerMap;
	/**
	 * 导出数据的list大小
	 */
	private int dataSize;

	public SpinnerLongHandler(Map<Integer, String[]> spinnerMap, int dataSize) {
		this.spinnerMap = spinnerMap;
		this.dataSize = dataSize;
	}

	@Override
	public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

	}

	@Override
	public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
		//获取一个workbook
		Sheet sheet = writeSheetHolder.getSheet();
		//设置下拉框
		DataValidationHelper helper = sheet.getDataValidationHelper();
		//定义sheet的名称
		String hiddenName = "hidden";
		//1.创建一个隐藏的sheet 名称为 hidden
		Workbook workbook = writeWorkbookHolder.getWorkbook();
		Sheet hidden = workbook.createSheet(hiddenName);
		Name category1Name = workbook.createName();
		category1Name.setNameName(hiddenName);
		for (Map.Entry<Integer, String[]> entry : spinnerMap.entrySet()) {
			//下拉框的起始行,结束行,起始列,结束列
			CellRangeAddressList addressList = new CellRangeAddressList(1, dataSize+500, entry.getKey(), entry.getKey());
			//获取excel列名
			String excelLine = getExcelLine(entry.getKey());

			//2.循环赋值
			String[] values = entry.getValue();
			for (int i = 0, length = values.length; i < length; i++) {
				// 3:表示你开始的行数  3表示 你开始的列数
				Row row = hidden.getRow(i);
				if (row == null) {
					row = hidden.createRow(i);
				}
				row.createCell(entry.getKey()).setCellValue(values[i]);
			}

			//4.  =hidden!$H:$1:$H$50  sheet为hidden的 H1列开始H50行数据获取下拉数组
			String refers = "="+hiddenName + "!$"+excelLine+
				"$1:$"+excelLine +"$"+ (values.length);
			//5 将刚才设置的sheet引用到你的下拉列表中
			DataValidationConstraint constraint = helper.createFormulaListConstraint(refers);
			DataValidation dataValidation = helper.createValidation(constraint, addressList);
			writeSheetHolder.getSheet().addValidationData(dataValidation);
		}
		//设置列为隐藏
		int hiddenIndex = workbook.getSheetIndex("hidden");
		if (!workbook.isSheetHidden(hiddenIndex)) {
			workbook.setSheetHidden(hiddenIndex, true);
		}
	}

	/**
	 * @Description 返回excel列标A-Z-AA-ZZ
	 * @Author chou
	 * @Date 2020/9/8
	 * @param num 列数
	 * @return java.lang.String
	 */
	public static 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;
	}
}

原理: 以wps为例:
wps设置跨sheet下拉框
在这里插入图片描述

在这里插入图片描述

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
要在 EasyExcel 设置下拉框多选,需要进行以下步骤: 1. 定义下拉框的列表数据,可以使用 List<String> 或者 String[] 等类型存储下拉框选项。 2. 创建一个 CellRangeAddressList 对象,用于指定下拉框的范围,可以使用 setFirstRow、setLastRow、setFirstCol、setLastCol 方法分别设置下拉框的起始行、结束行、起始列、结束列。 3. 创建一个 DataValidationHelper 对象,用于创建数据验证规则,在 DataValidationHelper 对象上调用 createValidation 方法,设置下拉框的数据来源、校验规则等。 4. 将创建好的数据验证规则应用到 Excel 单元格,可以使用 Sheet 对象的 addValidationData 方法将数据验证规则应用到指定的单元格范围。 下面是一个示例代码: ``` List<String> options = Arrays.asList("选项1", "选项2", "选项3"); CellRangeAddressList rangeList = new CellRangeAddressList(0, 10, 0, 0); DataValidationHelper helper = sheet.getDataValidationHelper(); DataValidationConstraint constraint = helper.createExplicitListConstraint(options.toArray(new String[options.size()])); DataValidation validation = helper.createValidation(constraint, rangeList); validation.setShowErrorBox(true); sheet.addValidationData(validation); ``` 上述代码,options 变量存储了下拉框选项,rangeList 变量指定了下拉框的范围,helper 变量创建了 DataValidationHelper 对象,constraint 变量创建了数据验证规则,validation 变量将数据验证规则应用到了指定的单元格范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值