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

如何用Python获取Excel单元格下拉选项值?现有代码异常求助

问题

需要用Python代码获取Excel指定单元格的下拉选项值,目前使用基于openpyxl的代码未得到正确结果:

from openpyxl import load_workbook

def get_dropdown_values(file_path, cell):
    workbook = load_workbook(file_path)
    sheet = workbook['TOR']
    
    for data_validation in sheet.data_validations.dataValidation:
        if cell in data_validation.sqref:
            if data_validation.type == 'list':
                return data_validation.formula1.split(',')
    return None

file_path = "305.xlsx"
cell_with_dropdown = "B46"  
dropdown_values = get_dropdown_values(file_path, cell_with_dropdown)
if dropdown_values:
    print("Dropdown values:", dropdown_values)
else:
    print("No dropdown menu found in the specified cell.")

当前输出为:Dropdown values: ['$AX$7:$AX$38'],但单元格B46的实际下拉选项值为TOR、XYM、WPQ、AAA,需要修正代码获取正确值。

解决方案

问题出在代码直接拆分了formula1,但这里的formula1返回的是单元格区域引用($AX$7:$AX$38),而非直接的选项值。需要解析这个区域,读取对应单元格的内容。

修正后的代码如下:

from openpyxl import load_workbook
from openpyxl.utils import range_boundaries

def get_dropdown_values(file_path, target_cell):
    # 加载工作簿时指定data_only=True,读取单元格实际值而非公式
    workbook = load_workbook(file_path, data_only=True)
    sheet = workbook['TOR']
    
    for dv in sheet.data_validations.dataValidation:
        # 检查目标单元格是否在数据验证的应用范围内
        if target_cell in dv.sqref:
            if dv.type == 'list':
                formula = dv.formula1
                # 区分两种下拉列表类型:单元格区域引用、直接逗号分隔选项
                if formula.startswith('='):
                    # 移除开头的等号,提取区域引用字符串
                    range_ref = formula[1:]
                    # 解析区域的行列边界
                    min_col, min_row, max_col, max_row = range_boundaries(range_ref)
                    # 遍历区域内单元格,收集非空值
                    dropdown_values = []
                    for row in range(min_row, max_row + 1):
                        cell_value = sheet.cell(row=row, column=min_col).value
                        if cell_value is not None:
                            dropdown_values.append(cell_value)
                    return dropdown_values
                else:
                    # 处理直接用逗号分隔的选项
                    return formula.split(',')
    return None

file_path = "305.xlsx"
cell_with_dropdown = "B46"  
dropdown_values = get_dropdown_values(file_path, cell_with_dropdown)
if dropdown_values:
    print("Dropdown values:", dropdown_values)
else:
    print("No dropdown menu found in the specified cell.")

关键修改说明:

  • 加载工作簿时添加data_only=True,确保读取单元格的实际显示值而非底层公式
  • 使用range_boundaries工具函数解析区域引用,获取目标范围的行列边界
  • 遍历区域内的单元格,筛选非空值作为下拉选项
  • 兼容两种常见的下拉列表配置:基于单元格区域的选项、直接写入的逗号分隔选项

内容的提问来源于stack exchange,提问作者Baxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:41:12