Excel多級聯動下拉菜單的自動化設置(使用Python中的openpyxl模塊)

1 主要目的

在Excel中,經常會遇到需要制作多級聯動下拉菜單的情況,要求單元格內填寫的內容只能從指定的多個選項中進行選擇,并且需要設置多級目錄,其中下級目錄的選項內容要根據上級目錄的填寫內容確定,如下圖所示:

?

上圖中的數據區域均要求通過下拉菜單實現。其中A列要通過下拉菜單選擇省份信息,B列要根據相應的省份信息,通過下拉菜單選擇相應的地市信息。

之前的博客已經講過多級聯動下拉菜單在Excel中的設置步驟。但考慮到數據量較大的情況,手動在Excel文件中進行設置的工作量較大,本文通過Python中的openpyxl模塊實現多級聯動下拉菜單的自動化設置。

2 基本原理

2.1 Excel中多級聯動下拉菜單設置的主要步驟

Excel中的下拉菜單主要通過名稱管理器以及數據驗證界面進行設置。

名稱管理器的界面如下圖所示。其中“名稱”欄記錄各選項集的名稱,“數值”欄記錄各選項集中的所有選項,“引用位置”欄記錄選項集中各選項在Excel文件中所在的單元格。

數據驗證界面如下圖所示。其中“來源”欄可通過indirect函數與名稱管理器中的選項集名稱進行關聯,以此來設置該單元格的選項范圍為該選項集中的選項;也可通過indirect函數關聯上一級目錄對應的單位格位置,以設置本單元格的選項應根據上一級單元格的內容來確定,實現多級聯動下拉菜單設置。

?

?

2.2 使用openpyxl完成自動化設置的主要思路?

由于Excel中的名稱管理器以及數據驗證相關設置均可由openpyxl模塊完成,可以通過該模塊對相關數據進行處理,并完成對Excel文件的相關設置,以實現多級聯動下拉菜單設置的自動化。主要包括三個關鍵步驟:

(1)將各選項集的信息寫入Excel文件。通過openpyxl模塊的相關操作,將各選項集信息寫入Excel文件中指定的頁面。

(2)將各選項集的信息加載至名稱管理器。由于openpyxl.workbook.defined_name模塊中的DefinedName函數可以進行Excel名稱管理器相關設置,可以將各選項集信息加載至名稱管理器。

(3)進行數據驗證相關內容設置。由于openpyxl.worksheet.datavalidation模塊中的DataValidation函數可以對數據驗證相關內容進行設置,可以通過該方法完成下拉菜單的制作。

3 選項數據準備

由于Excel中的多級聯動下拉菜單選項通常需要通過名稱管理器進行關聯,為了便于將數據選項寫入Excel中的名稱管理器,在Python中建立有序字典(OrderedDict),以保存下拉菜單的選項信息。

字典中的每條數據作為一個選項集合,鍵(key)為選項集名稱,值(value)為選項集中的選項。

代碼如下:

# data_options.pyfrom collections import OrderedDictdic = OrderedDict()
dic["省份"] = ["河北省","河南省","山西省"]
dic["河北省"] = ["石家莊市","保定市","張家口市"]
dic["河南省"] = ["鄭州市","開封市","洛陽市"]
dic["山西省"] = ["太原市","運城市","大同市"]if __name__ == "__main__":for key, value in dic.items():print(f"key = {key}, value = {value}")

如果選項集較多、數據量較大,可以使用Pandas模塊進行讀取和處理,并轉換為上述OrderedDict格式。具體過程不再贅述。

4 主要步驟

4.1 將選項數據寫入Excel文件

為了制作Excel中的下拉菜單,需要獲取每個下拉菜單的選項信息,即選項信息需要保存在Excel中。這里使用openpyxl模塊將選項信息寫入Excel文件。代碼如下:

# write_options.pyfrom data_options import dic
from openpyxl import Workbook
from openpyxl.utils import get_column_letterpath = r"D:\temp\table01.xlsx"  # 文件輸出路徑
sheet_name_dic = "dic"  # 保存在Excel中頁面的名稱book = Workbook()  # 新建Workbook
for sheet in book.sheetnames:del book[sheet]  # 刪除其他頁面
sheet_dic = book.create_sheet(sheet_name_dic)  # 新建sheetfor num, (key, value) in enumerate(dic.items(), start=1):sheet_dic[f"A{num}"] = key  # 第1列的值為key值(選項集名稱)for i in range(len(value)):sheet_dic[f"{get_column_letter(i+2)}{num}"] = value[i]# (上一行)依次將該選項集中的選項填充在該行后續列的單元格中book.save(path)  # 保存Excel文件

運行上述代碼后,打開保存的Excel文件(table01.xlsx)中的dic頁面如下:

其中A列為各選項集的名稱,B列及后續列為各選項集中的選項名稱。

4.2 Excel中名稱管理器設置

在將選項信息寫入Excel文件后,需要通過名稱管理器將選項信息與下拉菜單進行關聯,因此需要將各選項集的選項信息寫入Excel的名稱管理器中。

該步驟可以結合上一步(將選項數據寫入Excel文件)進行,在遍歷每個選項集的過程中,將該選項集的信息寫入Excel文件相應位置后,同步保存在Excel的名稱管理器中。

因此可以改寫上一步的代碼(write_options.py文件),加入保存名稱管理器相關步驟。主要添加以下代碼:

attr_text = f"{sheet_name_dic}!$B${num}:${get_column_letter(len(value)+1)}${num}"
# (上一行)設置名稱管理器中每個選項集的取值區域(如:attr_text = "dic!$B$1:$D$1)
value_range = DefinedName(key, attr_text=attr_text)  # 將選項集的名稱和選項映射為Excel名稱管理器中的格式
book.defined_names.append(value_range)  # 加入Excel中的名稱管理器

上述代碼中,第1行設置了每個選項集的選項取值區域,第3行將選項集名稱與選項信息轉換為Excel名稱管理器相關格式,第4行將該選項集信息加入Excel的名稱管理器。

改寫后的代碼如下:

# write_options.pyfrom data_options import dic
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.workbook.defined_name import DefinedNamepath = r"D:\temp\table01.xlsx"  # 文件輸出路徑
dic_name = "dic"  # 保存在Excel中頁面的名稱book = Workbook()  # 新建Workbook
for sheet in book.sheetnames:del book[sheet]  # 刪除其他頁面
sheet_dic = book.create_sheet(dic_name)  # 新建sheetfor num, (key, value) in enumerate(dic.items(), start=1):sheet_dic[f"A{num}"] = key  # 第1列的值為key值(選項集名稱)for i in range(len(value)):sheet_dic[f"{get_column_letter(i+2)}{num}"] = value[i]# (上一行)依次將該選項集中的選項填充在該行后續列的單元格中attr_text = f"{dic_name}!$B${num}:${get_column_letter(len(value)+1)}${num}"# (上一行)設置名稱管理器中每個選項集的取值區域(如:attr_text = "dic!$B$1:$D$1)value_range = DefinedName(key, attr_text=attr_text)  # 將選項集的名稱和選項映射為Excel名稱管理器中的格式book.defined_names.append(value_range)  # 加入Excel中的名稱管理器sheet_dic.sheet_state = "hidden"  # 隱藏該頁面
book.save(path)  # 保存Excel文件

運行上述代碼后,打開保存的Excel文件(table01.xlsx)中的名稱管理器如下:

可知各選項集的選項信息以保存在Excel文件的名稱管理器中。?

4.3 Excel中數據驗證設置

為了設置Excel中的下拉菜單,通常需要手動在Excel中的數據驗證界面完成相應的設置,如下圖所示:

為了完成數據驗證的自動化設置,需要使用openpyxl模塊,具體代碼如下:

# set_validation.pyfrom openpyxl import load_workbook
from openpyxl.worksheet.datavalidation import DataValidation"""參數設置"""
path = r"D:\temp\table01.xlsx"  # 文件路徑
table_name = "table"  # 數據表頁面名稱
row_num = 3  # 數據區域的行數(計劃在數據表中錄入多少條數據)
row_start = 1  # 數據區域從第幾行開始(如果第1行需要設置為標題行,則數據區域的起始行數應往后放)
name1 = "省份"  # Excel名稱管理器中,一級目錄選項關聯的選項集名稱"""文件讀取"""
book = load_workbook(path)  # 讀取Excel文件
sheet = book.create_sheet(table_name)  # 創建數據表頁面"""一級目錄的數據驗證設置"""
validation1 = DataValidation(type="list", allow_blank=True, showDropDown=False)  # 數據驗證選項
validation1.formula1 = f'=indirect("{name1}")'  # 數據驗證表達式
validation1.sqref = f"$A{row_start}:$A{row_start+row_num-1}"  # 數據驗證規則的應用區域
sheet.add_data_validation(validation1)  # 添加改規則"""二級目錄的數據驗證設置"""
validation2 = DataValidation(type="list", allow_blank=True, showDropDown=False)  # 數據驗證選項
validation2.formula1 = f'=indirect($A{row_start}:$A{row_start+row_num-1})'  # 數據驗證表達式
validation2.sqref = f"$B{row_start}:$B{row_start+row_num-1}"  # 數據驗證規則的應用區域
sheet.add_data_validation(validation2)  # 添加改規則"""保存文件"""
book.save(path)

其中DataValidation函數對應著一個Excel數據驗證界面設置;formula1對應著Excel數據驗證界面的“來源”一欄;sqref對應著該數據驗證規則的應用區域。

運行程序后,重新打開該Excel文件,發現已經成功新建了“table”頁面。打開該頁面,發現指定的區域已經成功設置了下拉菜單,如下圖所示:

分別打開A列(省份)、B列(地市)單元格的數據驗證界面,發現其設置符合預期要求。

?

5 小結?

本文通過Python中的openpyxl模塊分別完成“選項數據寫入”“名稱管理器設置”“數據驗證設置”等步驟,實現了Excel多級聯動下拉菜單的自動化設置,在錄入數據量較大的情況下能夠減少人工錄入的工作。

本文通過data_options.py、write_options.py以及set_validation.py共3個Python腳本文件,分別實現了選項數據準備、選項數據寫入及Excel名稱管理器設置、數據驗證設置功能。在實際操作時,可以將上述步驟合并為一個Python文件運行,以避免不必要的文件讀寫操作。合并后的總代碼如下:

from collections import OrderedDict
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.workbook.defined_name import DefinedName
from openpyxl.worksheet.datavalidation import DataValidation"""參數設置"""
path = r"D:\temp\table03.xlsx"  # 輸出文件路徑
dic_name = "dic"  # Excel中保存選項的頁面名稱
table_name = "table"  # Excel中數據表頁面名稱
row_num = 3  # 數據表中數據區域的行數(計劃在數據表中錄入多少條數據)
row_start = 1  # 數據表中數據區域從第幾行開始(如果第1行需要設置為標題行,則數據區域的起始行數應往后放)
name1 = "省份"  # Excel名稱管理器中,一級目錄選項關聯的選項集名稱"""選項數據整理"""
dic = OrderedDict()
dic[name1] = ["河北省","河南省","山西省"]
dic["河北省"] = ["石家莊市","保定市","張家口市"]
dic["河南省"] = ["鄭州市","開封市","洛陽市"]
dic["山西省"] = ["太原市","運城市","大同市"]"""選項數據寫入以及Excel名稱管理器設置"""
book = Workbook()  # 新建Workbook
for sheet in book.sheetnames:del book[sheet]  # 刪除其他頁面
sheet_dic = book.create_sheet(dic_name)  # 新建頁面,用于存放選項數據
for num, (key, value) in enumerate(dic.items(), start=1):sheet_dic[f"A{num}"] = key  # 第1列的值為key值(選項集名稱)for i in range(len(value)):sheet_dic[f"{get_column_letter(i+2)}{num}"] = value[i]# (上一行)依次將該選項集中的選項填充在該行后續列的單元格中attr_text = f"{dic_name}!$B${num}:${get_column_letter(len(value)+1)}${num}"# (上一行)設置名稱管理器中每個選項集的取值區域(如:attr_text = "dic!$B$1:$D$1)value_range = DefinedName(key, attr_text=attr_text)  # 將選項集的名稱和選項映射為Excel名稱管理器中的格式book.defined_names.append(value_range)  # 加入Excel中的名稱管理器
sheet_dic.sheet_state = "hidden"  # 隱藏該頁面"""數據驗證設置"""
sheet_table = book.create_sheet(table_name)  # 創建數據表頁面# 一級目錄
validation1 = DataValidation(type="list", allow_blank=True, showDropDown=False)  # 數據驗證選項
validation1.formula1 = f'=indirect("{name1}")'  # 數據驗證表達式
validation1.sqref = f"$A{row_start}:$A{row_start+row_num-1}"  # 數據驗證規則的應用區域
sheet_table.add_data_validation(validation1)  # 添加改規則# 二級目錄
validation2 = DataValidation(type="list", allow_blank=True, showDropDown=False)  # 數據驗證選項
validation2.formula1 = f'=indirect($A{row_start}:$A{row_start+row_num-1})'  # 數據驗證表達式
validation2.sqref = f"$B{row_start}:$B{row_start+row_num-1}"  # 數據驗證規則的應用區域
sheet_table.add_data_validation(validation2)  # 添加改規則"""保存文件"""
book.save(path)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74530.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74530.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.25-1 postman執行+弱網測試

1.導出json腳本 2.打包json文件 3.下載的文件 二 .導入腳本 選擇文件 點擊導入 導入的接口 三.多接口運行 (1)集合右鍵,點擊run ,運行多個接口 2.編輯環境,集合,執行次數等 運行多個接口 四.運行多個接口…

Pear Admin Flask 開發問題

下載代碼請復制以下命令到終端執行 git clone https://gitee.com/pear-admin/pear-admin-flask 于是我下載git 完成安裝后: 安裝 Git 后出現的頁面是 “Git for Windows 的版本發布說明(Release Notes)”,通常會在安裝完成后自動彈…

12-scala樣例類(Case Classes)

例類(Case classes)和普通類差不多,只有幾點關鍵差別,接下來的介紹將會涵蓋這些差別。樣例類非常適合用于不可變的數據。 定義一個樣例類 一個最簡單的樣例類定義由關鍵字case class,類名,參數列表&#…

cmakelist中添加opencv

版本選擇 qt的msvc,版本2019 opencv版本 4.5.3 配置了環境變量 x64下的v14中的bin 配置頭文件 {"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}","d:\\QT\\6.5.3\\msvc20…

【C語言】文件操作(詳解)

個人主頁 今天我們來講一下有關文件的相關操作,希望看完這篇文章對你有所幫助,大力感謝你對博主的支持! 文章目錄 ?一、為什么使用文件🎉二、什么是文件2.1 程序文件2.2 數據文件2.3 文件名 🎡三、二進制文件和文本…

基于web的家政服務網站

內容摘要 由于互聯網的使用,人們在管理、應用、服務等領域使用數據更加簡潔、方便,大大提高了工作效率。互聯網正逐漸融入我們的生活,影響和改變我們的生活。 家政服務管理系統是典型的信息管理系統(MIS)。其開發主要…

【leetcode hot 100 739】每日溫度

解法一&#xff1a;暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一個更高溫度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高溫度的地方wh…

藍橋杯C++基礎算法-0-1背包(優化為一維)

這段代碼實現了0-1 背包問題的動態規劃解法&#xff0c;并且使用了滾動數組來優化空間復雜度。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&#xff0c;每個物品有其體積 v[i] 和價值 w[i]&#xff0c;以及一個容量為 m 的背包。目標是選擇物品使得總價值…

算法 | 麻雀搜索算法原理,公式,改進算法綜述,應用場景及matlab完整代碼

一、麻雀搜索算法(SSA)原理 1. 算法基礎 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一種群體智能優化算法,靈感來源于麻雀群體的覓食與反捕食行為。算法將麻雀分為三類角色:發現者(Producer):適應度最高,負責探索全局最優區域;加入者(Follower)…

SQL 版本歷史

SQL&#xff08;Structured Query Language&#xff09;是一種用于管理和操作關系數據庫的標準語言。SQL標準由多個組織制定和維護&#xff0c;主要包括以下幾個版本&#xff1a; SQL-86 (SQL-87): 這是SQL的第一個官方標準&#xff0c;由ANSI&#xff08;美國國家標準協會&…

CAT1模塊 EC800M HTTP 使用后續記錄

記錄一下 CAT1 模塊EC800 HTTP 使用后續遇到的問題 by 矜辰所致目錄 前言一、一些功能的完善1.1 新的交互指令添加1.2 連不上網絡處理 二、問題出現三、分析及解決3.1 定位問題3.2 問題分析與解決3.2.1 查看變量在內存中的位置 3.3 數據類型說明3.3.1 常用格式化輸出符號…

單純形法之大M法

1. 問題背景與標準化 在求解某些線性規劃問題時&#xff0c;往往難以直接找到初始的基本可行解。特別是當約束中存在等式或 “≥” 類型的不等式時&#xff0c;我們需要引入人工變量來構造一個初始可行解。 考慮如下標準形式問題&#xff08;假設為最大化問題&#xff09;&am…

Springboot集成Debezium監聽postgresql變更

1.創建springboot項目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…

報錯 standard_init_linux.go:228: exec user process caused: exec format error

docker logs 容器名 報錯&#xff1a; standard_init_linux.go:228: exec user process caused: exec format error 或者 standard_init_linux.go:228: exec user process caused: input/output error 排查思路 1、檢查源鏡像的框架是否正確&#xff0c;是否amd64&#x…

Go 代理爬蟲

現在注冊&#xff0c;還送15美金注冊獎勵金 --- 亮數據-網絡IP代理及全網數據一站式服務商 使用代理服務器&#xff0c;通過 Colly、Goquery、Selenium 進行網絡爬蟲的基礎示例程序 本倉庫包含兩個分支&#xff1a; basic 分支包含供 Go Proxy Servers 這篇文章改動的基礎代碼…

STM32實現智能溫控系統(暖手寶):PID 算法 + DS18B20+OLED 顯示,[學習 PID 優質項目]

一、項目概述 本文基于 STM32F103C8T6 單片機&#xff0c;設計了一個高精度溫度控制系統。通過 DS18B20 采集溫度&#xff0c;采用位置型 PID 算法控制 PWM 輸出驅動 MOS 管加熱Pi膜&#xff0c;配合 OLED 實時顯示溫度數據。系統可穩定將 PI 膜加熱至 40℃&#xff0c;適用于…

neo4j知識圖譜常用命令

1. 查看所有節點和關系 如果你想查看圖數據庫中的所有節點和關系&#xff0c;可以使用以下查詢&#xff1a; Cypher 深色版本 MATCH (n)-[r]->(m) RETURN n, r, m n 和 m 表示節點。r 表示兩個節點之間的關系。這條命令會返回所有節點及其直接相連的關系。 2. 查看所有節…

從零開始:使用Luatools工具高效燒錄Air780EPM核心板項目的完整指南

本文將深入講解如何使用Luatools工具燒錄一個具體的項目到Air780EPM開發板中。如何使用官方推薦的Luatools工具&#xff08;一款跨平臺、命令行驅動的燒錄利器&#xff09;&#xff0c;通過“環境配置→硬件連接→參數設置→一鍵燒錄”四大步驟&#xff0c;幫助用戶實現Air780E…

2024年認證杯SPSSPRO杯數學建模C題(第二階段)云中的海鹽全過程文檔及程序

2024年認證杯SPSSPRO杯數學建模 C題 云中的海鹽 原題再現&#xff1a; 巴黎氣候協定提出的目標是&#xff1a;在2100年前&#xff0c;把全球平均氣溫相對于工業革命以前的氣溫升幅控制在不超過2攝氏度的水平&#xff0c;并為1.5攝氏度而努力。但事實上&#xff0c;許多之前的…

大疆上云api介紹

概述 目前對于 DJI 無人機接入第三方云平臺,主要是基于 MSDK 開發定制 App,然后自己定義私有上云通信協議連接到云平臺中。這樣對于核心業務是開發云平臺,無人機只是其中一個接入硬件設備的開發者來說,重新基于 MSDK 開發 App 工作量大、成本高,同時還需要花很多精力在無人…