Как получить значения выпадающего списка в excel?

Пытаюсь получить значения из выпадающего списка в excel, делаю все исходя из документации, вот пример кода

from openpyxl import load_workbook


wb = load_workbook('test.xlsx')
ws = wb['TestSheet']
cell = ws['H4']  # моя ячейка с выпадающим списком
data_validation = ws.data_validations.dataValidation
for i in data_validation:
    if cell.coordinate in i.sqref:
        print(i)

На вывод получаю объект

sqref=<MultiCellRange [H4:H500002]>, showDropDown=False, showInputMessage=False, showErrorMessage=True, allowBlank=False, errorTitle='Ошибка', error='Выберите значение из списка', promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, formula1='name17', formula2=None

Исходя из документации в атрибуте formula1 должна содержаться формула этого самого списка, хотя у меня там содержится некое name17.


Ответы (1 шт):

Автор решения: Clark Devlin

Разобрался.

name17 это именованный диапазон, где и содержится нужная мне информация. Чтобы получить необходимые мне данные использовал следующий код:

from openpyxl import load_workbook

# Загружаем рабочую книгу и лист
wb = load_workbook('test.xlsx')
ws = wb['Шаблон']
cell = ws['H4']

# Получаем данные валидации
data_validation = ws.data_validations.dataValidation

# Ищем нужную валидацию
for i in data_validation:
    if cell.coordinate in i.sqref:
        print(f"Ссылка ячейки: {i.sqref}")
        named_range = i.formula1.replace("=", "")  # Убираем знак равенства
        print(f"Именованный диапазон: {named_range}")
        if named_range in wb.defined_names:
            defined_name = wb.defined_names[named_range]
            for destination in defined_name.destinations:  # destination - это кортеж (sheet, range)
                sheet = wb[destination[0]]
                for row in sheet[destination[1]]:
                    for cell in row:
                        print(cell.value)

→ Ссылка