我想禁用 Excel 工作表中特定列的填充手柄和单元格拖放功能。然而,经过广泛的研究后,我了解到不可能仅针对一列禁用此功能;只能对整个工作表禁用它。我正在寻求有关如何禁用特定列或整个工作表的拖动选项的建议。
我尝试使用代码为列添加保护
cell.protection = Protection(locked=True)
但没有成功。
请参考以下代码示例。
代码创建一个工作簿,添加一些测试单元,然后设置并启用保护。
为简单起见,我仅在 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);
我相信这是您想要的操作,所以尝试一下吧。
如果这是您想要的,请理解将其应用于整个工作表意味着大量操作,因为 Openpyxl 逐个单元格地工作,这意味着您必须循环遍历工作表中的每个单元格,例如 17,178,820,608 个单元格。您可能不太可能需要应用于整个工作表,因此仅使用您实际添加数据的范围显然会花费更少的时间。
如果您确实需要在整个工作表上应用,您可能需要考虑使用 Xlwings 或 Win32com,因为这些应用程序使用 Excel 及其操作,可以通过一个操作在整个工作表上应用,这样会更快。