我在 Python 脚本中使用 OpenPyxl 库时遇到问题。 我能够创建数据验证,但是当我检查最终结果时,我只能在应该出现数据验证下拉表的单元格中看到我的公式 (
='Loss Level Tree'!$B$64:$G$64
)。
我可以手动解决问题(我不希望这样做,这会破坏脚本的全部目的),方法是进入数据验证设置并单击“将这些更改应用到具有相同设置的所有其他单元格” ”。手动执行此操作后,最终结果看起来是正确的。
我的脚本做错了什么?
我尝试使用 pywinauto / pywin32 库来自动化交互部分,但没有用。
脚本(考虑到出于安全目的,文件名和 wbook 已被删除):
filename = X
wbook = openpyxl.load_workbook(r'Y)
sheet = wbook["Count BO"]
validation_t = DataValidation(type='list', formula1='"={0}!$B$64:$G$64"'.format(quote_sheetname('Loss Level Tree')), allow_blank=True, showErrorMessage=False, showDropDown=False)
sheet.add_data_validation(validation_t)
validation_t.add('T2:T1048576')
wbook.save(r'E:\file)
对于包含两个工作表“Count BO”和“Loss Level Tree”的工作簿,其中“Loss Level Tree”工作表在单元格 B64:G64 中保存数据验证值,以下代码适用于我。
这是您的代码,其“validation_t”值按照注释中的建议进行了修改,如注释“### 修改为使用单引号”下的代码所示
如今,您更有可能使用 f 字符串来创建公式。我还在代码中的注释“### Modified to use f string”下包含了该选项。这个方法对我也有效。
我不知道为什么范围返回#REF,因为它应该存在或不存在,但您可以尝试使用 f 字符串。
import openpyxl
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.utils import quote_sheetname
# filename = X
wbook = openpyxl.load_workbook('foo.xlsx')
sheet = wbook["Count BO"]
### Original
# validation_t = DataValidation(type='list', formula1='"={0}!$B$64:$G$64"'.format(quote_sheetname('Loss Level Tree')), allow_blank=True, showErrorMessage=False, showDropDown=False)
### Modified to use single quotes
# validation_t = DataValidation(type='list', formula1='={0}!$B$64:$G$64'.format(quote_sheetname('Loss Level Tree')), allow_blank=True, showErrorMessage=False, showDropDown=False)
### Modified to use f string
validation_t = DataValidation(type='list', formula1=f"'Loss Level Tree'!$B$64:$G$64", allow_blank=True, showErrorMessage=False, showDropDown=False)
sheet.add_data_validation(validation_t)
validation_t.add('T2:T1048576')
wbook.save('foo_out.xlsx')