Excel多级联动下拉菜单设置

embedded/2025/3/14 23:49:07/

1.问题描述

现有数据表如下图所示:

该表中包括省、市、县三级目录。

现要将其整理成数据表模板,如下图所示:

要求制作成下拉菜单的形式,且每一级目录的下拉菜单列表要根据上一级目录的内容来确定。

如上图所示,只有在“省”级列表中选择了“北京市”,才能在“市”级列表中选择“北京市市辖区”,进而才能在“县区”级列表中选择“海淀区”“朝阳区”等内容。

2.主要思路

2.1第一步:数据字典整理

首先根据数据表中的内容,整理出多级数据字典,存放在Excel文件中不同的页面。如下图所示:

上图中分别整理出了省、市、县区三级字典。

其中一级字典(省)中,将数据项垂直排列即可;

二级字典(市)中,每行的第1个元素为上一级字典中的项,后续元素为该一级字典对应的二级字典中的项。如在二级字典(市)中,第1行中,第1个元素为“河南省”,后续元素分别为“开封市”“郑州市”。

三级字典(县区)以此类推。

2.2第二步:下拉菜单设置

根据前面制作的数据字典,在Excel中进行相关设置,制作出多级联动下拉菜单。

详细过程参见后文。

3.数据整理

(如果能够手动整理出上述的数据字典,则该部分可以略过。)

为了制作出所需的数据字典,使用Python对数据表进行处理,详细代码如下。

其中path为源文件路径,sheet_name为Excel文件内页面的名称,path_out为输出的字典文件路径。

python">import pandas as pd"""文件路径设置"""
path = r"D:\temp\data.xlsx"  # 源文件路径
sheet_name = "Sheet1"
path_out = r"D:\temp\data2.xlsx"  # 输出文件路径"""转换函数定义"""
"""用于将DataFrame格式转换为list(二维列表)格式"""
def frame2list(data):data_1 = data.iloc[:,0]  # 提取出DataFrame的第1列set_1 = set(data_1)  # 构建集合,用于将DataFrame第1列的数据去重if len(data.columns) == 1:return list(set_1)else:list_all = list()  # 初始化二维列表,用于存放DataFrame第1列每一项的处理结果for item in set_1:  # 依次处理DataFrame第1列每项数据data_temp = data[data.iloc[:,0]==item]  # 获取DataFrame中该项对应的所有行set_temp = set(data_temp.iloc[:,1])  # 将对应到的第2列中所有数据进行去重list_item = [item]  # 初始化一维列表,用于存放对应到的DataFrame第2列中的每项数据for item_temp in set_temp:  # 依次处理对应到的DataFrame第2列每项数据list_item.append(item_temp)  # 将该第2列数据加入一维列表list_all.append(list_item)  # 将一维列表加入二维列表return list_all"""主函数"""
if __name__ == "__main__":data = pd.read_excel(path, sheet_name=sheet_name, header=0)  # 读取Excel文件class_num = len(data.columns)  # 获取列数with pd.ExcelWriter(path_out) as f:  # 打开输出文件并写入for i in range(class_num):  # 逐列计算并写入输出文件dic_i = set()  # 初始化集合,用于消除重复值if i == 0:dic_i = set(data.iloc[:,0])else:dic_i = frame2list(data.iloc[:,i-1:i+1])df_i = pd.DataFrame(dic_i)  # 转换为DataFrame格式,便于输出为Excel文件df_i.to_excel(f, index=False, header=False, sheet_name=data.columns[i])  # 输出文件

该程序最终输出一个Excel文件,其中包含3个页面,分别对应3级数据字典。

如前文2.1节中的图所示。 

4.下拉菜单制作

4.1数据表准备

将上述生成的数据字典各页面与数据表模板放在一个Excel文件内,保存为不同的页面,如下图所示:

其中“数据表模板”页表示要制作出下拉菜单的数据表页面,如下图所示:

“省”“市”“县区”页分别为数据字典页。

4.2一级下拉菜单设置

对于一级菜单,选中所有需要填写一级目录数据的表格,在“数据”页点击“数据验证”。

进入“数据验证”对话框后,在“允许”项选择“序列”;

在“来源”项选择一级目录中的所有数据。

如:一级数据主要存放于Excel中“省”页面下的A1至A4格,则“来源”中填写“=省!$A1:$A4”。

其中“省”为Excel中存放以及数据的页面名称;“!”为页面与单元格之间的分隔符;“$A1:$A4”为数据在“省”页面中的分布范围。

注意在“来源”的输入框中,“A1”“A4”字母前面要有美元符号$,而数字前面不能有该符号。

如果手动选择字典中的单元格,默认字母和数字前面都会带上美元符号,所以需要手动取消。

返回“数据表模板”页面,看到一级目录已经设置完成。

4.3多级下拉联动菜单设置

在Excel中,对于二级、三级等目录,均进行如下设置:

4.3.1字典内容创建

对于二级目录,选中字典区域,然后点击“公式”栏中的“根据所选内容创建”。

对于三级目录,参照二级目录设置。

 在弹出的对话框中勾选“最左列”,确定。

 

4.3.2下拉菜单与字典的关联

以二级菜单为例。

在“数据表模板”页面中,选中所有需要填写二级数据表的单元格,点击“数据”页的“数据验证”。

在弹出的“数据验证”对话框中,“允许”一栏仍选择“序列”,“来源”一栏输入“=indirect($A2:$A4)” 。

其中indirect函数表示对上一级单元格的关联;

$A2:$A4表示该“数据表模板”页面中需要填写上一级目录的单元格范围。如上图单元格B2至B4内要填写“市”的内容,则indirect函数内要输入“省”的单元格范围($A2:$A4)。

注意这里的数字前面也不能加美元符号$。

点击“确定”后会提示“源当前包含错误”,点击“是”就可以。

回到“数据表模板”页面,可以看到二级联动下拉菜单也设置成功。

参照二级下拉菜单的设置,可以完成三级下拉菜单的设置。

 

最后可根据需要,将数据字典页面隐藏。


http://www.ppmy.cn/embedded/172612.html

相关文章

DataEase:一款国产开源数据可视化分析工具

DataEase 是由飞致云开发的一款基于 Web 的数据可视化 BI 工具,支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,帮助用户快速分析业务数据并洞察其趋势,为企业的业务改进与优化提供支持。 DataEase 的优势在于:…

文件解析漏洞靶场通关合集

一、IIS解析漏洞 &#xff08;一&#xff09;iis6的目录解析漏洞(.asp目录中的所有文件都会被当做asp文件执行) 第一步&#xff1a;在网站根目录下创建了一个x.asp文件夹&#xff0c;并在文件夹中创建一个名为1.txt的文本文档 第二步&#xff1a;文本文档中输入<% now()%&…

零成本搭建Calibre个人数字图书馆支持EPUB MOBI格式远程直读

文章目录 前言1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网使用kindle访问内网私人书库 前言 嘿&#xff0c;各位书虫们&#xff01;今天要给大家安利一个超级炫酷的技能——如何在本地Windows电脑上搭建自己的私人云端书库。亚马逊服务停了&#xff…

华为OD机试 - 平均像素值-贪心算法(Java 2024 E卷 100分)

题目描述 一个图像有 ( n ) 个像素点,存储在一个长度为 ( n ) 的数组 img 里,每个像素点的取值范围是 ([0,255]) 的正整数。请你给图像每个像素点值加上一个整数 ( k )(可以是负数),得到新图 newImg,使得新图 newImg 的所有像素平均值最接近中位值 ( 128 )。请输出这个整…

【Java基础】Java 的内部类

前言 在 Java 编程的浩瀚宇宙中&#xff0c;内部类宛如一颗独具魅力的星辰&#xff0c;为代码的组织与设计开辟了新的天地。内部类&#xff0c;从字面意义理解&#xff0c;就是定义在另一个类内部的类。这种看似简单的嵌套结构&#xff0c;却蕴含着强大的能量&#xff0c;不仅…

基于Redis实现限流

限流尽可能在满足需求的情况下越简单越好&#xff01; 分布式限流是指在分布式系统中对请求进行限制&#xff0c;以防止系统过载或滥用资源。以下是常见的分布式限流策略及其实现方式&#xff1a; 1、基于 Redis 的固定窗口限流 原理&#xff1a; 设定一个时间窗口&#xff0…

Python 正则表达式模块 re

Python 正则表达式模块 re flyfish 一、正则表达式基础 1. 什么是正则表达式&#xff1f; 正则表达式&#xff08;Regular Expression, RE&#xff09;是一种用于匹配、查找和替换文本模式的工具&#xff0c;由普通字符&#xff08;如字母、数字&#xff09;和特殊字符&…

HTTP 各版本协议简介

HTTP HTTP 本质上是客户端-服务器计算模型中的请求/响应协议&#xff0c;是万维网的主要通信方式。最初的版本由 &#xff08;Tim Berners-Lee&#xff09;在 1989 年作为应用程序协议提出&#xff0c;非常有限&#xff0c;并迅速修改以支持更广泛的浏览器和服务器功能。 尽管…