如何使用Python的openpyxl库获取Excel下拉菜单的选项列表
提取Excel下拉菜单的所有选项(openpyxl实现)
嘿,我太懂你这种搜遍创建方法却找不到提取方案的憋屈了!当初我要批量导出Excel里的下拉选项时,也在openpyxl文档里翻了好久才摸清楚门路——官方确实没把这块写得很直白,我来给你一步步拆解。
Excel里的下拉菜单本质是**数据验证(Data Validation)**的一种类型(序列类型),所以我们要做的就是定位到工作表里的数据验证规则,然后解析出对应的选项列表。
核心代码实现
from openpyxl import load_workbook from openpyxl.utils import range_boundaries def get_dropdown_options(file_path, sheet_name=None): wb = load_workbook(file_path, data_only=False) if sheet_name: ws = wb[sheet_name] else: ws = wb.active # 默认取第一个工作表 dropdown_options = [] # 遍历工作表中的所有数据验证规则 for dv in ws.data_validations.dataValidation: # 只处理序列类型的下拉菜单(Excel里的序列验证就是下拉菜单) if dv.type == "list": formula = dv.formula1.strip() # 公式里存着选项来源 # 情况1:选项直接写在公式里(比如"苹果,香蕉,橙子") if formula.startswith('"') and formula.endswith('"'): options = formula.strip('"').split(',') dropdown_options.extend(options) # 情况2:选项引用单元格区域(比如"A1:A3"或"Sheet2!B2:B5") else: # 处理跨工作表引用,拆分出工作表名和区域 if '!' in formula: ref_sheet_name, ref_range = formula.split('!', 1) ref_sheet = wb[ref_sheet_name.strip("'")] else: ref_sheet = ws ref_range = formula # 解析单元格区域的边界 min_col, min_row, max_col, max_row = range_boundaries(ref_range) # 遍历区域内的单元格,提取值 for row in ref_sheet.iter_rows(min_row=min_row, max_row=max_row, min_col=min_col, max_col=max_col): for cell in row: if cell.value is not None: dropdown_options.append(str(cell.value)) # 去重并返回(如果需要保留重复可以去掉这步) return list(set(dropdown_options)) # 示例用法 if __name__ == "__main__": options = get_dropdown_options("你的文件路径.xlsx", "Sheet1") print("下拉菜单选项:", options)
关键细节说明
- data_only=False:必须设为False,这样才能获取到数据验证的公式(如果设为True,只会取单元格的值,拿不到公式)。
- dv.type == "list":只有类型为"list"的数据验证才是下拉菜单,其他类型(比如整数、日期验证)我们不需要处理。
- 两种选项来源:Excel下拉菜单的选项要么是直接写在公式里的逗号分隔字符串,要么是引用其他单元格的区域,代码里分别处理了这两种情况。
- 区域解析:用
range_boundaries来解析单元格区域的起止位置,避免手动处理$符号(比如$A$1:$A$3)的麻烦。
如果你的Excel文件里有多个工作表的下拉菜单,只需要循环遍历所有工作表重复上面的逻辑就好啦。
内容的提问来源于stack exchange,提问作者Matvey_coder3
相关产品推荐
相关产品推荐

