JAVA动态实现Excel三级级联菜单

这篇博客详细介绍了如何使用Java和Apache POI库动态实现Excel中的三级级联菜单。通过利用Excel的名称管理器和数据有效性功能,结合Java代码创建和设置数据有效性,实现了省份、地市和区县的级联选择。文章通过步骤分解,展示了如何创建名称、设置数据有效性以及在Java中动态操作Excel的方法。

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


如何实现如下图所示的Excel三级级联菜单的效果呢?


.1     Excel的关键点

.1.1  名称管理器

Excel内置了名称管理器、可以存储类似Java的键值对


如图,名称管理器里面,名称和数值就是键、值的关系,一个省份对应若干地市,一个地市对应若干区域,这不正是实现级联的基础吗?

请注意下方的引用位置里面的表达式:

=市区!$B$249:$B$262

这里如何理解呢?

市区!表示数据要从这个sheet里面去找

$B$249:$B$262表示从B列第249行的单元格到B列第262行的单元格

如下图:

.1.2  数据有效性

既然实现级联菜单,我们需要控制每个Excel下拉框的数据;在Excel里面,这是通过数据有效性来控制的

接下来,就是如何设置数据有效性了

 

.1.2.1       省份的数据有效性

 

省份是第一个下拉框,我们直接使用静态数据,把数据有效性的范围指定为省份sheet的数据


.1.2.2       地市的数据有效性

地市的数据有效性,需要引用名称管理器里面的数据;为什么呢,因为省份动态选择后,我们需要找到相应省份下属的地市,只有这些地市才应该纳入到选择的范围。

         例如,选择了山西省,则地市应该全部是山西下属的地市。

       我们需要让地市的范围指向刚才的名称管理器里的对应项,我们把这个名称管理器里面的项目的名字和省份的名字设置为一致,就能建立关联

       再回到名称管理器,我们看到有一个叫山西省的项目:

        

                   接下来,我们让地市下拉框的数据有效性指向它:

                  

如图,通过INDIRECT这个函数,指向了名称管理器,=INDIRECT($M$2)。这样,地市下拉框的数据范围就是对应名称管理器里面的数据,也就实现了地市的级联下拉;$M$2代表省份选择的单元格,这个单元格我们让它为动态的,就能实现每一行都是级联的,这个我们后面通过java来实现。

.1.2.3       区县的数据有效性

区域的数据有效性原理同地市,不过由于全国范围内的地市可能重名,所以我们的名称管理器是按XX省XX市这样来建立的,对应的数据有效性也是这样设置的:

=INDIRECT(CONCATENATE($M$2,$N$2)),这里把上级的省份和地市拼接到一起,再去关联名称管理器:

如图,对应的名称管理器选项就是山西省长治市

.2     Java创建名称管理器

我们用Apache的POI来操作Excel,简单点,先上代码:

/**

   

Excel 三级 联动 下拉框 宏代码 实例 代码注释 先在第一个下拉框加入一个valiation, 内容是 =$A$2:$A$5 Private Sub Worksheet_Change(ByVal Target As Range) ' Call back function which defined within according worksheet Dim i As Integer Dim tempStr As String Dim firstDrawBoxRowCount As Integer Dim firstDrawBoxColumn As Integer firstDrawBoxRowCount = 4 'Define the row number of first draw box firstDrawBoxColumn = 1 'Define the column number of ifrst draw box Dim secondDrawBoxRowCount As Integer Dim secondDrawBoxColumn As Integer secondDrawBoxRowCount = 33 'Define the row number of second draw box secondDrawBoxColumn = 4 'Define the column number of second draw box If Target.Column = 1 Then 'This defines the first column of draw box list, you can also define the row number of draw box list Cells(Target.Row, Target.Column + 1) = "" ' Do the clean first Cells(Target.Row, Target.Column + 1).Validation.Delete Cells(Target.Row, Target.Column + 2) = "" Cells(Target.Row, Target.Column + 2).Validation.Delete For i = 2 To firstDrawBoxRowCount + 1 'Enter the cycle to find out the content for column 2 If Trim(Cells(Target.Row, Target.Column)) = Trim(Cells(i, firstDrawBoxColumn)) Then tempStr = Trim(Cells(i, firstDrawBoxColumn + 1)) 'Find out the options for second draw box, it is seperated by , Cells(Target.Row, Target.Column + 1).Select ' Fill the validation to second draw box With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:=tempStr .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .IMEMode = xlIMEModeNoControl .ShowInput = True .ShowError = True
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值