EasyExcel实现级联下拉框

使用EasyExcel导出下拉框 formula:公式,用于指定自定义的数据验证条件。通过使用,您可以为 Excel 中的单元格设置数据验证的约束条件,以确保输入的数据符合指定的规则。 阅读详情
AI摘要

项目需求为在导出的 Excel 省和市两列实现级联下拉选择框。使用 EasyExcel 3.3.4 版本和 JDK 17 实现,需创建类实现接口,实现时要创建隐藏页,读取时从第二页开始,级联下拉是生成 Excel 前创建额外页并隐藏防止误操作。

EasyExcel版本: 3.3.4
JDK: 17

最近项目有个需求导出excel需要在省和市两列实现级联下拉选择框,特地记录一下

EasyExcel 实现级联下拉框需要创建一个类实现SheetWriteHandler 接口, 下面给出Demo,
这个类无需修改可以直接使用, 但是需要注意由于实现级联下拉需要创建一个隐藏的sheet页,
所以在读取这个excel的时候需要从第二个sheet页开始读取, 跳过第一个sheet页

public class CascadeSheetWriteHandler implements SheetWriteHandler {

	// sheetName
	private final String sheetName;
	// 下拉框从哪一行开始
	private final int firstRow;
	// 下拉框从哪一行结束
	private final int lastRow;
	// 父级下拉框在哪一列 注意: 从0开始
	private final int parentColumnIndex;
	// 子级下拉框在哪一列 注意: 从0开始
	private final int childColumnIndex;
	// 父级与子级的映射关系, key为父级 value为子级
	private final Map<String, List<String>> cascadeMap;

	public CascadeSheetWriteHandler(String sheetName, int provinceColumnIndex, int cityColumnIndex, Map<String, List<String>> provinceCityMap) {
		this.sheetName = sheetName;
		this.childColumnIndex = cityColumnIndex;
		this.parentColumnIndex = provinceColumnIndex;
		this.cascadeMap = provinceCityMap;
		this.firstRow = 1;
		this.lastRow = 10000;
	}

	public CascadeSheetWriteHandler(String sheetName, int provinceColumnIndex, int cityColumnIndex, int firstRow, int lastRow, Map<String, List<String>> provinceCityMap) {

		if (firstRow > lastRow) {
			throw new IllegalStateException("The first row must be less than the last row");
		}

		this.sheetName = sheetName;
		this.childColumnIndex = cityColumnIndex;
		this.parentColumnIndex = provinceColumnIndex;
		this.cascadeMap = provinceCityMap;
		this.firstRow = firstRow;
		this.lastRow = lastRow;
	}


	@Override
	public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
		// 创建级联映射的sheet页
		Workbook workbook = writeWorkbookHolder.getWorkbook();
		Sheet hiddenSheet = workbook.createSheet(sheetName);
		// 隐藏辅助 sheet
		workbook.setSheetHidden(workbook.getSheetIndex(hiddenSheet), true);

		int rowIndex = 0;
		for (Map.Entry<String, List<String>> entry : cascadeMap.entrySet()) {
			Row row = hiddenSheet.createRow(rowIndex);
			// 父级放在 A 列
			row.createCell(0).setCellValue(entry.getKey());

			// 子级从 B 列开始
			for (int i = 0; i < entry.getValue().size(); i++) {
				row.createCell(i + 1).setCellValue(entry.getValue().get(i));
			}
			rowIndex++;
		}
	}

	@Override
	public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
		Sheet sheet = writeSheetHolder.getSheet();
		Workbook workbook = writeWorkbookHolder.getWorkbook();
		DataValidationHelper helper = sheet.getDataValidationHelper();

		// 1. 父级下拉框
		String[] parents = cascadeMap.keySet().toArray(new String[0]);
		Name parentRange = workbook.createName();
		String parentName = "Parents" + UUID.randomUUID().toString().replace("-","").substring(0,3);
		parentRange.setNameName(parentName);
		parentRange.setRefersToFormula(sheetName + "!$A$1:$A$" + parents.length);

		DataValidationConstraint parentConstraint = helper.createFormulaListConstraint(parentName);
		// 设置父级下拉框范围
		CellRangeAddressList parentRangeAddressList = new CellRangeAddressList(firstRow, lastRow, parentColumnIndex, parentColumnIndex);
		DataValidation parentValidation = helper.createValidation(parentConstraint, parentRangeAddressList);
		sheet.addValidationData(parentValidation);

		// 2. 子级级联下拉框
		for (int i = 0; i < parents.length; i++) {
			String parent = parents[i];
			int rowIndex = i + 1; // Excel 索引从 1 开始 这里要加1
			int cityStartColumn = 1; // 城市数据从 B 列开始

			Name childRange = workbook.createName();
			childRange.setNameName(parent.replace(" ", "_")); // 确保 Excel 名称合法
			childRange.setRefersToFormula(sheetName + "!$B$" + rowIndex + ":$" + (char) ('A' + cityStartColumn + cascadeMap.get(parent).size() - 1) + "$" + rowIndex);
		}

		// 将父级索引转换成 26位英文字母格式
		String parentColumnLetter = getColumnLetter(parentColumnIndex);
		String childFormula = "INDIRECT($" + parentColumnLetter + "2)";

		DataValidationConstraint cityConstraint = helper.createFormulaListConstraint(childFormula);
		// 设置子级级联下拉框范围
		CellRangeAddressList cityRangeAddressList = new CellRangeAddressList(firstRow, lastRow, childColumnIndex, childColumnIndex);
		DataValidation cityValidation = helper.createValidation(cityConstraint, cityRangeAddressList);
		sheet.addValidationData(cityValidation);
	}

	/**
	 * 将列索引转换为 Excel 的列字母,例如:
	 * 0 -> A, 1 -> B, 2 -> C, ..., 25 -> Z, 26 -> AA, ...
	 */
	private String getColumnLetter(int columnIndex) {
		StringBuilder columnName = new StringBuilder();
		while (columnIndex >= 0) {
			columnName.insert(0, (char) ('A' + (columnIndex % 26)));
			columnIndex = (columnIndex / 26) - 1;
		}
		return columnName.toString();
	}

}
	public static void main(String[] args) {

		Map<String, List<String>> provinceCityMap = new LinkedHashMap<>();
		provinceCityMap.put("湖北省", Arrays.asList("武汉市", "黄石市", "鄂州市"));
		provinceCityMap.put("广东省", Arrays.asList("广州市", "深圳市", "佛山市"));
		provinceCityMap.put("江苏省", Arrays.asList("苏州市", "南京市", "无锡市"));

		EasyExcel.write("C:\\Users\\Administrator\\Desktop\\demo.xlsx", DemoExcel.class)
			.registerWriteHandler(new CascadeSheetWriteHandler("省市级联映射", 2, 3, provinceCityMap))
			.sheet("sheet1")
			.doWrite(new ArrayList<>());

	}

最终效果:
示例

实际上级联下拉就是在生成excel之前创建一个额外的sheet页, 其中A列存放父级选项, 从B列开始存放这个父级的子级选项, 隐藏是为了防止被误操作, 导致级联下拉失败
在这里插入图片描述

EasyExcel多列单元格设置下拉框 EasyExcel官网文档地址:https://easyexcel.opensource.alibaba.com/docs/current/项目场景:实际开发中,需要用到很多下拉框去供使用者选择特定得值,但是easyExcel官方文档中提供得示例很简单,只有1个列有下拉框。在此分享一下多列下拉框得心得体会。 阅读详情

相关推荐

使用 easypoi 导出带三级下拉联动的 excel

使用 easypoi 导出带三级下拉联动的 excel

heshiyuan1406146854的博客 3955

工作总结—基于Easyexcel的级联下拉选择实现

基于EasyExcel的级联下拉选择实现;

qq_38999264的博客 4118

EasyExcel动态下拉框踩坑实录:从‘为什么下拉不显示’到完美实现级联选择

本文详细解析了使用EasyExcel实现动态下拉框和级联选择时遇到的常见问题及解决方案。从下拉框不显示的排查指南到级联下拉的实现技巧,再到大数据量下的性能优化,提供了全面的实战经验。特别针对INDIRECT函数的正确使用和动态公式生成进行了深入探讨,帮助开发者高效完成Excel数据交互功能。

weixin_30698527的博客 381

EasyExcel实现动态生成包含下拉框、级联下拉框的excel表格

但是这个表格里面包含了下拉框,耗时两天才算是把这个excel表格搞完,现在记录一下,方便后续回顾。普通下拉数据,就是如同性别、是否之类的数据;Map中的key就是要关联的列,注意:excel列从0开始,value就是下拉数据的数组。其中,子类返回的map中,key就是父类返回数组的值,value就是子类列的下拉列表。根据D列的检查类型,E列弹出不同的下拉选项,F列弹出不同的问题属性;这个拦截器是在service层使用的,就是最上面的代码。SheetWriteHandler接口。直接上代码,代码中有注释。

maziaotong的博客 6197

EasyExcel动态下拉框踩坑实录:从‘为什么失效’到‘完美级联’的完整避坑指南

本文深入解析EasyExcel动态下拉框的实现原理与常见问题,提供从基础设置到级联下拉的完整解决方案。针对Excel数据验证的行索引限制、级联失效等典型问题,给出具体排查方法和优化技巧,并分享生产环境中的异常处理与性能优化实践,帮助开发者高效实现复杂Excel报表需求。

weixin_33725270的博客 435

基于EasyExcel实现模板导出功能(含查数据库下拉,市州区县级联下拉)

基于EasyExcel实现模板导出功能(含下拉,市州区县级联下拉)

JesseXW的博客 3253

EasyExcel实战:如何用SheetWriteHandler实现动态下拉框与级联选择(附完整代码)

本文详细介绍了如何利用EasyExcel的SheetWriteHandler机制实现动态下拉框与级联选择功能,适用于电商后台、ERP系统等复杂业务场景。通过完整的代码示例和性能优化技巧,帮助开发者高效构建交互式Excel导出方案,提升数据验证的灵活性和用户体验。

weixin_42522320的博客 398

EasyExcel之SheetWriteHandler:解锁Excel写入的高阶玩法

EasyExcel是阿里巴巴开源的Java Excel处理框架,其SheetWriteHandler接口为开发者提供了强大的Excel写入控制能力。本文详细介绍了该接口的核心功能与实际应用场景,主要包括: 数据验证功能实现:通过示例展示了固定下拉框(如性别选择)、动态下拉框(如商品分类)和级联下拉框(如省市级联)的创建方法。 样式定制技术:讲解了表头样式设置(字体、背景色、对齐方式)和数据行动态样式设置(如根据销售额设置不同背景色)的实现方式。 实际应用案例:以电商订单导出和员工管理系统为例,演示了如何结合

qq_36984455的博客 3173

JAVA下载EXCEL模板文件设置下拉框以及级联下拉框(easyExcel)

基于easyExcel实现的导出下拉框、easyExcel使用杂记

qq_43878405的博客 6796

EasyExcel导出动态下拉框的完整配置流程:从简单列表到突破255限制的进阶指南

本文详细介绍了使用EasyExcel实现动态下拉框的完整配置流程,从基础列表创建到突破Excel 255字符限制的进阶方案。通过SheetWriteHandler和公式引用技术,开发者可以灵活应对不同规模的数据验证需求,提升Excel导出的交互性和实用性。

weixin_28672681的博客 249

鱼眼相机矫正实战:除了棋盘格,试试横向展开和经纬度法(OpenCV4/C++实现对比)

本文对比了鱼眼相机矫正的三种主流方法:棋盘格标定法、横向展开法和经纬度法,通过OpenCV4/C++实战代码解析,帮助开发者在自动驾驶、VR全景拼接和安防监控等场景中选择最适合的技术方案。重点分析了各方法的精度、处理速度和适用场景,为工程实践提供实用指导。

weixin_29032489的博客 283

springboot实现下载Excel模板下载,实现单选下拉框、二级或二级关联、表头添加备注

springboot实现定制化excel表格下载,实现二级、三级级联下拉框,表头批注、单选下拉框等功能

ldy15729357137的博客 1150

ShardingSphere-JDBC-若依框架集成(SpringBoot)

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架前后端版本、动态数据源,可自行切换,默认数据源为达梦8代理端,

编程小菜鸟的笔记 8168

easyexcel导出功能修改模板中的公式和下拉框获取

easyexcel的公式和下拉框实现

weixin_44236424的博客 2280

高缺失率时空数据插补实战:从随机森林到扩散模型的性能对比

数据缺失是数据分析与机器学习建模中普遍面临的挑战,尤其在时空数据领域,传感器故障、传输中断等问题常导致数据不完整。数据插补技术旨在基于已知数据的模式和关联性,合理估算缺失值,为后续分析提供可靠基础。其核心原理在于利用数据的时空相关性(如时间周期性、空间邻近性)及与外部驱动因素(如交通、气象)的关联构建预测模型。这项技术的价值在于能将不完整的数据集转化为可用于高质量分析和预测的可用资产,广泛应用于环境监测、交通流量预测、金融风控等领域。本文聚焦于一个极具挑战性的场景——PM2.5监测数据缺失率高达82%,通过

weixin_30363285的博客 544

雷赛控制卡全方位使用指南:从硬件连接到高级应用

雷赛控制卡以其接口简单、编程便捷、性价比高的特点,成为中小自动化设备的理想选择。使用时需注意:硬件连接需注重抗干扰设计(屏蔽线、接地);软件开发需合理配置运动参数(脉冲当量、加减速);调试阶段需充分利用 DMCStudio 工具验证性能。通过本文介绍的方法,可快速实现从硬件搭建到复杂运动控制的全流程开发,满足雕刻、切割、装配等多场景的自动化需求。

品质生活,极致编程。 3772

【excel动态下拉框、动态级联下拉框】

excel动态下拉框、动态级联下拉框

weixin_45871527的博客 333

《时序分析、时序约束和时序收敛》专栏的说明与导航

《时序分析、时序约束和时序收敛》专栏的说明与导航(建议阅读)。

孤独的单刀 14万+

Java Poi实现二级级联菜单

【代码】Java Poi实现级联菜单。

weilipenghahha的博客 993

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能

《Vue3+OpenLayers实现多边形绘制与区域处理》摘要:本文介绍如何基于Vue3+OpenLayers+ol-ext实现地图多边形交互功能。核心功能包括:鼠标绘制任意多边形、拖动顶点编辑边界、遮罩显示(非选区变红)、选区剪切显示及功能重置。技术方案采用OpenLayers处理地图渲染,ol-ext实现高级遮罩/剪切效果,ElementPlus提供UI控件。该方案适用于城市规划、园区展示等需要区域标记的场景,完整代码展示了从初始化、绘制、编辑到特效处理的全流程实现。

小彭的博客 959

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

在大模型微调中,我们一般使用Alpaca 和 ShareGPT和两种格式的数据集。

Science prince的博客 1096

EasyExcel动态下拉框的三种实现方式解析

本文详细解析了EasyExcel实现动态下拉框的三种方式:自定义注解、动态数据接口和隐藏Sheet页。通过对比分析各方案的优缺点,帮助开发者根据业务需求选择最佳实现,提升Excel导出功能的灵活性和用户体验。特别适用于需要数据回填和动态选项的场景。

weixin_29000991的博客 408

行测测评——矩阵、圆形、环形三角图形数列推理解题技巧

写在前面:各大公司的测评做的让人眼花缭乱,很多题型都是第一次见,比如逻辑关系、信息推理,最难的要属找规律的数字推理了。根据B站UP主刘文超老师的课程,记录一下解题技巧。感谢UP主的无私奉献,原地址连接:https://www.bilibili.com/video/BV1it411M7o2?t=528&p=7 解题技巧: 从图形的上下、左右、交叉 角度进行尝试求解 基本法则是“加、减、乘、除、倍数、次方”六种形态。 一、有心数阵 解题技巧:周边数字通过某种运算得到中间数字 1.周边数..

涵盖了计算机专业基础知识、数学建模相关实践、复杂网络论文研究、LeetCode算法刷题经验、C语言开发经验、前端Vue、React框架开发实战相关知识 8642

EasyExcel动态下拉框踩坑实录:从‘为什么我的下拉不生效’到完美级联的完整避坑指南

本文详细解析了使用EasyExcel实现动态下拉框和级联下拉框的完整流程,从基础实现到性能优化,涵盖常见问题排查和高级应用场景。通过实战代码示例,帮助开发者解决下拉框不显示、级联失效等问题,提升Excel数据处理效率。

weixin_33727510的博客 397

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

从注解到界面:EasyExcel下拉框的声明式开发实践

本文介绍了使用EasyExcel实现声明式下拉框开发的实践方法,通过注解驱动的方式简化Excel导出功能。文章详细讲解了注解体系设计、动态数据获取机制以及与Spring生态的集成,显著提升开发效率和维护性,特别适合企业级应用中的复杂Excel导出需求。

weixin_29012677的博客 442

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

springBoot+vue+EsayExcel导出级联的下拉选择框

使用esayExce级联下拉框数据导出,简单易懂!!!

4440

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 关于FTP未设置工作模式导致无法读取到文件问题
下一篇: 记录Spring Cloud 项目集成 Power Job遇到的若干问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值