使用openpyxl如何禁止受保护工作表的单元格被选中与复制?
问题根源
你当前的保护配置能被绕过实现复制,核心是两个容易踩的坑:
- openpyxl 序列化工作表保护配置时,仅会将和类默认值不一致的属性写入最终的xlsx文件。你只设置了开启保护、设置密码,没有主动配置选中权限的规则,生成的保护节点缺失对应属性,Excel 打开文件时会按照“允许用户选中所有单元格”的默认宽松规则加载。
- Excel 的复制、全选操作完全依赖单元格的选中状态,只要能选中任意单元格,哪怕列是隐藏的,按下Ctrl+A全选后,复制操作会把选中范围内(含隐藏列)的所有内容拷到剪贴板,自然就会出现你遇到的问题。
解决方式
要实现禁止复制的效果,不需要额外安装插件,只要在原有保护配置基础上,显式关闭两个选中权限即可——从根源上让用户根本选不中任何单元格,自然没法触发复制操作。
需要加的两个关键配置项:
selectLockedCells = False:禁止用户选中默认被标记为“锁定”的单元格selectUnlockedCells = False:禁止用户选中未标记为“锁定”的单元格
修正后的完整代码如下:
import openpyxl from openpyxl.styles import Protection, NamedStyle work_book = openpyxl.load_workbook(r"你的文件路径.xlsx") work_sheet = work_book['Sheet1'] # 原有保护配置 work_sheet.protection.sheet = True work_sheet.protection.password = '你的保护密码' # 关键补充配置:必须显式赋值,否则序列化时不会将规则写入文件,配置会失效 work_sheet.protection.selectLockedCells = False work_sheet.protection.selectUnlockedCells = False work_book.save(r"保存后的文件路径.xlsx")
实际效果
保存生成的文件,打开受保护的工作表后:
- 点击任意单元格都不会出现选中状态
- 全选、复制的快捷键全部处于不可用状态
- 因为没有可复制的选中对象,既没法把表内内容粘贴到其他位置,也不会连带拷出之前设置的隐藏列内容
内容的提问来源于stack exchange,提问作者Hummer
相关产品推荐
相关产品推荐

