Создание DataValidation, которое приводит к ошибке с openpyxl - PullRequest
0 голосов
/ 29 января 2020

Используя python и openpyxl Я пытаюсь создать зависимый список данных с DataValidation , как в примере из этой статьи .

DataValidation отлично работает, когда я указываю прямо на некоторый диапазон ячеек. Но когда я создаю каскад, то полученный файл Excel поврежден и может быть открыт только в режиме восстановления.

Сейчас я могу только предположить, что это может быть связано с ошибкой, когда первый столбец пуст, а затем сохранен каскадно DataValidation Excel показывает всплывающее окно с ошибкой

Источник в настоящее время оценивается как ошибка. Вы хотите продолжить?

Тем не менее, мы можем сохранить такое потенциально ошибочное подтверждение данных при выполнении его вручную в Excel. Это просто оставляет нам пустой список данных.

Так что мой вопрос: openpyxl не поддерживает такие ошибки? Или есть какой-то аргумент DataValidation, который я пропустил, чтобы молча пропустить такие ошибки? Любая другая идея создать DataValidation, которая оценивается как ошибка с python?

Пример кода для воспроизведения ошибки:

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

wb = Workbook()
sheet1 = wb.active
data_sheet = wb.create_sheet("DATA")
data_sheet['A1'] = "data1"
data_sheet['A2'] = "value1"
data_sheet['A3'] = "value2"
data_sheet['B1'] = "data2"
data_sheet['B2'] = "other value1"
data_sheet['B3'] = "other value2"
data_sheet['B4'] = "other value3"

formula = "DATA!1:1"
data_validation = DataValidation(type='list', formula1=formula, allow_blank=True)
sheet1.add_data_validation(data_validation)
data_validation.add("A1")

# when I comment this section out 
# and create data validation with following formula by hand 
# it can be saved in excel and it works
# but as I mentioned, error popup appears in excel
formula2 = "OFFSET(DATA!A2;0;MATCH(A1;DATA!1:1;0)-1;COUNTA(OFFSET(DATA!A:A;0;MATCH(A1;DATA!1:1;0)-1))-1)"
data_validation2 = DataValidation(type='list', formula1=formula2, allow_blank=True)
sheet1.add_data_validation(data_validation2)
data_validation2.add("B1")

wb.save("example.xlsx")

ПРИМЕЧАНИЕ. Сейчас я пытаюсь использовать другой подход к справиться с ошибкой с помощью формулы Excel , в зависимости от того, что произойдет раньше, решить мою проблему.

1 Ответ

0 голосов
/ 30 января 2020

Так что мой друг-специалист по Excel показал мне , против ;

Мне плохо, что я попытался вставить формулу openpyxl, разделенную точкой с запятой как в моем Excel, но библиотека использует для этой цели только запятые независимо от windows региональных настроек.

Опять одурачен windows ... Надеюсь, это сэкономит другим много часов Я потратил впустую на обнаружение ошибки.

#working formula, replaced semicolons with commas
formula2 = "OFFSET(DATA!A2,0,MATCH(A1,DATA!1:1,0)-1,COUNTA(OFFSET(DATA!A:A,0,MATCH(A1,DATA!1:1,0)-1))-1)"
...