Python openpyxl - 想要保护工作表但允许对所有列进行过滤、排序,并允许在“D”列上进行编辑

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

我有一个 Excel 文件,我想保护它,但也想允许

  • 过滤所有列
  • 对所有列进行排序
  • 编辑“D”列中的所有单元格(最好以 D2 结尾(以保留 D1 中的标题)

我已经走到这一步了。

这在一定程度上执行并起作用,因为该工作表现在受到保护。

但是... 过滤器“存在”但不起作用(无法单击它们) 排序不起作用 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")
python excel openpyxl
1个回答
1
投票

我已将可以在工作表上设置的个人保护添加到您的代码中。每个状态都设置为执行时预期的状态

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")
© www.soinside.com 2019 - 2024. All rights reserved.