Excel-多级联动

Excel多级联动–数据有效性与indirect函数的结合使用

目标:
设置多级联动菜单
数据源:
制作如下,通过颜色和内容,可以看出联动关系:
在这里插入图片描述
联动菜单:
在这里插入图片描述
步骤一:
设置一级菜单
选中F10单元格,【数据】-【数据验证】-【数据验证】,【设置】选项卡-【验证条件】-【允许】选择【序列】,【来源】选择F2:F3区域,默认为绝对引用:
在这里插入图片描述
步骤二:
设置二级联动
①定义名称
选中G2:G4,即“百度”对应的“运营模块”的内容,
【公式】-【名称管理器】(快捷键:ctrl+F3),在弹出框中选择【新建】
在这里插入图片描述
【新建名称】的【名称】会默认为是第一个单元格的内容,我们把这个名称改为“百度”,也就是他们的联动上一级的名称;
【范围】根据需要选择【工作簿】或者某个sheet页;
【引用位置】就是刚才我们选定的目标区域范围,默认为绝对引用。
确定。
在这里插入图片描述
同样的方法定义另一个二级联动的名称:
在这里插入图片描述
②数据有效性和indirect函数
给二级联动的内容定义好名称以后,选中G10单元格(即二级菜单被显示的单元格),【数据】-【数据验证】-【数据验证】,【设置】选项卡-【验证条件】-【允许】选择【序列】,
【来源】填写公式【=INDIRECT($F$10)】,默认为绝对引用,F10单元格显示的是当前单元格G10的上一级菜单。
确定。
这时,二级菜单完成。
步骤三:
设置三级联动菜单
①如上方法,将二级联动对应的项目内容区域,定义名称,分别为各自对应的二级联动菜单的名称:
在这里插入图片描述
方法相同,直到最后一个也设置完成:
在这里插入图片描述
②给三级联动的内容定义好名称以后,选中H10单元格(即三级菜单被显示的单元格),在【数据验证】-【来源】填写公式
【=INDIRECT( $G$10)】(默认为绝对引用),G10单元格显示的是当前单元格H10的上一级菜单,也就是二级菜单。
在这里插入图片描述
完成。
总结:
①四级联动、五级联动,方法同上;
②主要两个步骤:
第一步,定义区域,名称一定要设置为上级的名称,因为indirect函数返回的是参数所指定的单元格的值,也就是我们之前定义好的名称所对应的区域;
第二步,数据验证的来源,使用indirect函参数是当前联动菜单的上一级菜单单元格,因为上一级菜单单元格名称与定义好的名称一致,而indirect函数返回这一单元格定义名称下的区域,这样联动关系就成立了。

资料来源:
https://jingyan.baidu.com/article/5553fa82035ce565a23934ba.html

### 如何使用 Apache POI 实现 Excel 文件中的多级联动效果 为了实现在 Java 中利用 Apache POI 库创建具有多级联动功能的 Excel 表格,可以按照如下方法编写代码: #### 创建带有下拉列表的数据验证规则 首先定义好父级和子级项所在的单元格区域,并设置相应的数据有效性约束。 ```java // 建立工作簿对象 Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("MultiLevelDropdown"); // 准备一些测试数据作为父级菜单项 Row row0 = sheet.createRow(0); row0.createCell(0).setCellValue("Fruits"); row0.createCell(1).setCellValue("Vegetables"); // 将上述类别名称写入隐藏的工作表中供后续引用 HelperSheet helperSheet = (HelperSheet)wb.createSheet("HiddenList"); helperSheet.createRow(0).createCell(0).setCellValue("Apple"); helperSheet.createRow(1).createCell(0).setCellValue("Banana"); helperSheet.createRow(2).createCell(0).setCellValue("Carrot"); helperSheet.createRow(3).createCell(0).setCellValue("Broccoli"); // 定义父级择范围 Name namedCell = wb.createName(); namedCell.setNameName("Category"); String reference = "HiddenList!$A$1:$B$2"; namedCell.setRefersToFormula(reference); // 设置第一个单元格为父级分类的择框 DataValidationConstraint constraintCatgory = dvHelper.createExplicitListConstraint(new String[]{"Fruits", "Vegetables"}); CellRangeAddressList addressListParent = new CellRangeAddressList(1, 65530, 0, 0); // A2:A65531 dvHelper.createValidation(constraintCatgory, addressListParent); ``` #### 动态更新子级下拉列表依据所父级项目调整其内容 当用户择了不同的父级条目,对应的子级应该展示与之匹配的具体项。这一步骤可以通过监听事件并修改数据验证条件来完成;然而,在静态生成文件的情况下,则需预先设定所有可能组合。 ```java // 预设两个不同类型的食品清单用于演示目的 Map<String, List<String>> subItemsMapping = Map.of( "Fruits", Arrays.asList("Apple", "Banana"), "Vegetables", Arrays.asList("Carrot", "Broccoli") ); for (Entry<String, List<String>> entry : subItemsMapping.entrySet()) { DataValidationConstraint constraintSubItem = dvHelper.createFormulaListConstraint(entry.getKey()); int rowIndexStart = 1; for(String item : entry.getValue()){ Row tempRow = helperSheet.getRow(rowIndexStart++); if(tempRow == null){ tempRow = helperSheet.createRow(rowIndexStart-1); } tempRow.createCell(0).setCellValue(item); } CellRangeAddressList addrLstChild = new CellRangeAddressList(1, 65530, 1, 1); // B2:B65531 dvHelper.createValidation(constraintSubItem, addrLstChild); } ``` 以上代码片段展示了如何基于选定的不同父级类别动态改变子级可项的内容[^2]。需要注意的是实际应用环境中通常会从数据库或其他持久化存储获取这些关联关系而非硬编码于程序内部。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值