Есть ли способ сохранить или добавить раскрывающийся список в Excel через openpyxl? - PullRequest
2 голосов
/ 18 июня 2020

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

Например, у меня есть ячейка C42 на ws (основная форма ), Мне нужен раскрывающийся список, который ссылается на K2: K4 на ws1 (раскрывающийся список). Вот что у меня есть на данный момент:

from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = load_workbook(pathdb+Filepathdb)
ws=wb['Main Form']
ws1=wb['Drop Down List']

dv = DataValidation(type='list', formula1=ws1['K2:K4'], allow_blank=True, showDropDown=True)
ws.add_data_validation(dv)
dv.add(ws["C42"])

Может ли кто-нибудь помочь относительно того, где я ошибаюсь? Когда я добавляю это, он также портит форматирование всего файла excel.

Также пробовал:

data_val = DataValidation(type="list",formula1='K2:K4', allow_blank=True, showDropDown=True) 
ws1.add_data_validation(data_val)  
data_val.add(ws["C42"])

1 Ответ

1 голос
/ 19 июня 2020

Если у вас большее количество IPS (10+), лучше сначала сохранить их в столбце где-нибудь в Excel, а затем использовать их диапазон в качестве «источника» для проверки данных, известного как формула1

from openpyxl.worksheet.datavalidation import DataValidation
wb = Workbook()
ws = wb.create_sheet('New Sheet')
for number in range(1,100): #Generates 99 "ip" address in the Column A;
    ws['A{}'.format(number)].value= "192.168.1.{}".format(number)

data_val = DataValidation(type="list",formula1='=$A:$A') #You can change =$A:$A with a smaller range like =A1:A9
ws.add_data_validation(data_val)

data_val.add(ws["B1"]) #If you go to the cell B1 you will find a drop down list with all the values from the column A

wb.save('Test.xlsx')
...