You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:27:41