如何实现如下图所示的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,简单点,先上代码:
/**