如何使用 openpyxl 从 python 中的选定单元格中删除数据验证

问题描述 投票:0回答:1

我正在使用 openpyxl 打开一个模板文件,该文件的数据验证深入到大约 5 列中的第 500 行。在我的 python 脚本中,我将数据从 Oracle 加载到电子表格的左半部分,数据验证列位于右侧。

如果我插入的数据只有 50 行,我需要删除 450 行的数据验证条目和公式。但从 openpyxl 中的特定单元格中删除验证规则似乎是不可能的。

看来我可能不得不忘记拥有一个包含最多 500 行数据验证的模板,并手动创建验证规则,这是我希望避免的。预先填充模板要容易得多,只需删除我不需要的内容即可。

下面这个不起作用,因为“validation.sqref”类似于“M2:500”(因为这是验证规则所在的位置),因此永远不会匹配当前迭代中单元格的单元格引用。

for row in range(start_row_to_delete, ws_data.max_row + 1):
    for col in range(1, ws_data.max_column + 1):
        cell = ws_data.cell(row=row, column=col)
            if ws_data.data_validations:
                for validation in ws_data.data_validations.dataValidation:
                    if validation.sqref == cell.coordinate:
                        ws_data.data_validations.remove(validation)
python openpyxl
1个回答
0
投票

您处理此问题和实现代码的方式存在一些问题。
然而,主要问题使该方法变得过时,我认为无论如何,这都是浪费时间。
DataValidation 没有删除选项,因此如果执行了

ws_data.data_validations.remove(validation)
行,则没有方法
.remove()
。此外,您要删除的“验证”是整个工作表范围,因此如果您可以通过该方法删除它,则整个 DV 范围都将被删除。
没有任何方法可以从单个单元格中删除 DV,因此您的选择是删除 DV 并仅重新应用到您需要的范围。
然而,即使这样做也可能效率低下。如果使用 Python 将数据添加到工作表中,同时将 DV 添加到所需的单元格似乎会更有效。

如果绝对有必要在模板中应用 DV,以便删除这 450 行 DV,那么我认为简单地删除第 50 - 500 行将是更好的选择。 如果采用此路线,请反向删除行,即从第 500 行开始,然后删除 499、498 等到工作表中最后使用的行。

© www.soinside.com 2019 - 2024. All rights reserved.