Openpyxl 禁用填充手柄和单元格拖放

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

我想禁用 Excel 工作表中特定列的填充手柄和单元格拖放功能。然而,经过广泛的研究后,我了解到不可能仅针对一列禁用此功能;只能对整个工作表禁用它。我正在寻求有关如何禁用特定列或整个工作表的拖动选项的建议。

我尝试使用代码为列添加保护

cell.protection = Protection(locked=True)
但没有成功。

python excel openpyxl
1个回答
0
投票

请参考以下代码示例。

代码创建一个工作簿,添加一些测试单元,然后设置并启用保护。
为简单起见,我仅在 A1 到 J50 范围内工作。如果这适合您,您可以扩展到整个工作表(如果有必要,请记住 Openpyxl 更新单元格的方式,这可能是使用 Openpyxl 和/或应用于整个工作表的决定因素)。

在此示例中,我将 C 列设置为禁用拖放的列。
所以 C 列保持“锁定”启用状态

其他列已禁用它。

import openpyxl
from openpyxl.styles import Protection

wb = openpyxl.Workbook()  # Create new workbook
ws = wb.active  # Default Sheet


### Write some data to the sheet for drag drop testing
ws['C4'].value = 'NoDrag1'
ws['C6'].value = 'NoDrag2'

ws['B5'].value = 'Drag1'
ws['D5'].value = 'Drag1'

### Remove protection from Columns A to J and up to row 50 leaving Column C untouched.
### This could be done in two loops, Columns A & B then D - J or disable across the whole range and reapply to C which is the way I've done it here  
for row in ws.iter_rows(min_row=1, max_row=50, min_col=1, max_col=10):
    for cell in row:
        cell.protection = Protection(locked=False)

### Reset protection on for Column C back on
for row in ws.iter_rows(min_row=1, max_row=50, min_col=3, max_col=3):
    for cell in row:
        cell.protection = Protection(locked=True)

### Enable the protection on the Sheet
ws.protection.enable()

### Save the workbook
wb.save('protection.xlsx')

运行代码并打开工作簿后,您将拥有一个如下所示的工作表(称为 Sheet);

  • 如果您单击单元格“B5”或“D5”并尝试将其拖动到指定范围 A1:J50 中除 C 列之外的另一个单元格,则应该有效。
  • 如果您尝试将其拖到 C 列中的任何单元格中,您应该会收到受保护的单元格错误。
  • 如果您尝试将“C4”或“C6”(或 C1 到 C50 范围内的任何单元格)拖动到工作表上的任何其他单元格(指定范围内),您应该会收到受保护的单元格错误。

我相信这是您想要的操作,所以尝试一下吧。

如果这是您想要的,请理解将其应用于整个工作表意味着大量操作,因为 Openpyxl 逐个单元格地工作,这意味着您必须循环遍历工作表中的每个单元格,例如 17,178,820,608 个单元格。您可能不太可能需要应用于整个工作表,因此仅使用您实际添加数据的范围显然会花费更少的时间。
如果您确实需要在整个工作表上应用,您可能需要考虑使用 Xlwings 或 Win32com,因为这些应用程序使用 Excel 及其操作,可以通过一个操作在整个工作表上应用,这样会更快。

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