在excel实现多级联动

本文记录了Excel多级联动功能的实现步骤。先从数据库导出单位数据到Excel,用VBA编码操作取出各级单位,生成对应列。接着通过名称管理器和数据验证设置下拉框,用VBA代码动态添加下级单位名称,最后设置各级单位单元格的数据有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 最近做了一个Excel的多级联动的功能,具体是将全国所有的气象局按一二三四级单位做成四列,实现各级的联动下拉选择,这和省市县乡的各级联动的功能基本一样,下面记录下具体的操作步骤。

1、首先需要从数据库中将所有单位按照Id ,父级ID ,单位名称,导出excel,

2、将所有单位中的一级单位单独取出作为新的一列放置。我这里的操作方法是用excel中的VBA进行编码操作。前提是excel需要启用宏设置,下面是启用宏设置的方法:

   (1)将excel另存为启用宏的工作簿 然后打开保存的启用宏的工作簿

(2)点击左上方的文件-选项-信任中心-信任中心设置-宏设置-启用-确认

 

 

3、点击一个sheet 邮件选择查看源码

4、按图示插入窗体和按钮修改按钮的名称为一级单位

6、双击按钮或者右键查看代码 就能够编写点击这个按钮以后需要做的工作的代码了 ,瞬间感觉这个操作和.net的winform差不多

7编写代码 将一级单位名称,一级单位Id,因为一级单位的父ID是同一个,所以这里就不把他的父Id给单独拿出来了 

 

8、同样添加二级单位。三级单位、四级单位的按钮,分别添加对应的代买,因为其中的代码基本一样,只是取得列和父Id的列不一样,这里就只贴出二级单位的代码

9.添加完以后点击运行,分别点击各个单位的按钮,就在sheet1中自动生成了对应单位级别的列,并将对应的单位给填充进对应的列上。

10、到这里前期准备工作就完成了,接下来在excel公式中点击名称管理器,添加一级单位的名称和对应的取值范围。

11、选中对应一级单位的单元格,点击数据下面的数据验证,在设置中的验证条件选中允许,来源=刚才设置的名称管理器中的名称,此时选中的单元格就会出现下拉框选择,选择的内容就是设置名称管理器中的一级单位对应的引用位置(取值范围)

 

12、接下来我们添加二级三级四级单位的名称,由于一级单位数量相对比较少,也比较连续,上面添加名称的方式比较简单,但是下级单位比较多,添加起来就比较麻烦,并且所属的父级单位需要一个一个的找,工作量比较大,所以这里还是用VBA代码将剩下添加名称的动态的给添加上,这样就减少了很大的工作量,继续在窗体中添加按钮,修改名称,双击查看对应的操作代码,添加代码,这里同样贴出一个代码样例。是生成二级名称的

13、选中对应二级单位对应的单元格,点击数据有效性,设置和一级单位基本一样,不过来源那里需要根据选中的一级单位的名称进行筛选,使用=INDIRECT($A3),其中$A3为一级单位所选择的名称,INDIRECT函数返回指定的区域,依次类推,剩下级别的单位也这样设置

致此,所有的工作已经做完。我们来看下效果:

注意事项:二级、三级单位必须是按上级单位的顺序排列,否则数据取起来会不准确。也比较麻烦,这个demo给大家做一个参考,希望对以后或者其他的工作有所帮助

 

转载于:https://www.cnblogs.com/mingqi-420/p/10888171.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、付费专栏及课程。

余额充值