我有一个 Excel 文件,我想保护它,但也想允许
我已经走到这一步了。
这在一定程度上执行并起作用,因为该工作表现在受到保护。
但是... 过滤器“存在”但不起作用(无法单击它们) 排序不起作用 D 列仍然不可编辑
希望得到一些指导。
使用 python 3.9 和 openpyxl 3.0.10
from openpyxl import load_workbook
from openpyxl.styles.protection import Protection
# open wb
wb = load_workbook("test2.xlsx")
# select sheet1
ws = wb["Sheet1"]
# protect sheet
ws.protection.enabled = True
ws.protection.password = 'password'
# allow filtering on all cols
ws.auto_filter.ref = "A1:H1"
ws.auto_filter.enable = True
# allow editing on all cells in col D
for row in ws.iter_rows():
for cell in row:
cell.protection = Protection(locked=(cell.column != "D"))
# save to new file
wb.save("test9.xlsx")
我已将可以在工作表上设置的个人保护添加到您的代码中。每个状态都设置为执行时预期的状态
ws.protection.enabled = True
标记为已更改的除外。
重新启用自动过滤器非常简单,只需将 autoFilter 设置回 False
.autoFilter = False
这允许选择过滤器。
有一个
sort
设置
.sort = False
但将其改回
False
不会启用排序。我能确定的最好情况是您不能重新启用排序,以下内容来自 Microsoft 帮助网站;我还更改了循环,将第 2 行到最后使用的行的 D 列锁定保护设置为关闭。编辑 D 列可以排除“最大行”下方的标题和单元格。如果您希望 D 列中可编辑的行数多于“已用范围”,您可以在
max_row
中设置 iter_rows
值。
from openpyxl import load_workbook
from openpyxl.styles.protection import Protection
# open wb
wb = load_workbook("test2.xlsx")
# select sheet1
ws = wb["Sheet1"]
# allow editing on all cells in col D
for row in ws.iter_rows(min_row=2, min_col=4, max_col=4):
for cell in row:
cell.protection = Protection(locked=False)
print(cell.protection.locked)
### protect sheet
ws.protection.enabled = True
ws.protection.password = 'password'
### All individual sheet protections set per 'protection.enabled = True'
### Except those marked as 'Changed'
prot = ws.protection
prot.selectLockedCells = False
prot.selectUnlockedCells = False
prot.algorithmName = None
prot.sheet = True
prot.objects = False
prot.insertRows = True
prot.insertHyperlinks = True
prot.autoFilter = False # Changed
prot.scenarios = False
prot.formatColumns = True
prot.deleteColumns = True
prot.insertColumns = True
prot.pivotTables = True
prot.deleteRows = True
prot.formatCells = True
prot.saltValue = None
prot.formatRows = True
prot.sort = False # Changed
prot.spinCount = None
prot.hashValue = None
# allow filtering on all cols
ws.auto_filter.ref = "A1:H1"
ws.auto_filter.enable = True
# save to new file
wb.save("test9.xlsx")