如何用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
相关产品推荐
相关产品推荐

