新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python批量保护Excel工作表:openpyxl实现添加与解除保护

发布时间:2026/9/3 3:04:29来源:尧图网络
Python批量保护Excel工作表:openpyxl实现添加与解除保护
之前在业务报表维护中我遇到过一类很低级但很头疼的问题发给协作同事的 Excel 表里公式列总会被无意改掉等发现的时候已经覆盖了多行数据。后来想到用 Excel 自带的“保护工作表”功能逐表处理但表格一多就非常耗时。于是我用 Python 整理了一套完整的处理方案既能批量给 Excel 文件添加工作表保护也能按需解除保护还能在保护后保留指定单元格的编辑权限。这套方案基于 openpyxl代码量不大但涉及的概念需要先理清工作表保护、工作簿结构保护、文件打开加密这三者的用途完全不同。为了让你拿到就能用下方内容会从原理讲起再给出可复制的代码脚本并补充实际排查经验。适合有 Python 基础、经常处理 Excel 报表的读者也适合想通过办公自动化减少重复操作的开发者。1. 背景与核心概念1.1 为什么要给 Excel 文件添加保护Excel 几乎是业务协作中绕不开的工具但表格一旦参与多方编辑就容易出现下面这些场景报表模板中的公式列被覆盖导致汇总结果错误。别人调整了列宽、行高、数据格式破坏了原本的排版。数据源 sheet 被误删除整份工作簿少了一张底表。自己维护的月度报表需要发给多人填写却没法限制每个人只能在指定区域录入。这些问题虽然不一定会造成数据丢失却会显著增加重复维护的成本。正常情况下Excel 自带功能就能处理选中单元格区域后点击“审阅 - 保护工作表”就能限制编辑。但当你需要对几十个文件重复设置或者每隔一段时间就调整一次保护范围时手工操作效率就很低。用 Python 做这件事最大的价值不在“能不能保护一个文件”而在于“能不能用同样的规则批量保护一批文件”并且把规则沉淀成脚本需要时直接运行。1.2 三种“保护”不能混为一谈很多初学者会把“Excel 保护”理解成一件事。实际上在 Excel 文件里至少存在三种保护粒度保护类型触发方式作用范围典型效果文件打开加密打开文件时输入密码整个文件不知道密码就无法打开文件工作表保护编辑某个工作表时限制操作单个工作表锁定的单元格不可编辑可设置允许操作项工作簿结构保护对工作簿整体操作限制整个工作簿禁止插入、删除、重命名、移动工作表本文主要讲解 Python 处理较多的工作表保护与解除保护。文件打开加密属于“文件加密容器”openpyxl 并不负责处理后面会单独说明它的边界。1.3 这套教程能帮你掌握什么通过阅读本文并动手实践你可以掌握用 openpyxl 对 Excel 工作表开启/关闭保护。开启保护时设置密码并允许某些区域继续编辑。保护公式列让被保护单元格的公式不被看到。批量保护一个目录下的多个 Excel 文件。批量解除工作表保护。定位 PermissionError、密码丢失、xls 格式不支持等常见问题。文中的代码均基于.xlsx格式文件建议在测试环境中先验证再用于正式文件。2. 环境准备与版本说明2.1 安装 Python 与 openpyxl如果你还没有安装 Python可以去 Python 官网下载安装包。Windows 安装过程中建议勾选“Add Python to PATH”这样后续在命令行里直接使用python命令会更方便。安装完成后打开命令行窗口先确认 Python 环境正常python --version再安装 openpyxlpython -m pip install openpyxl如果你使用 VSCode 编写代码建议先确认当前终端里选中的是哪一个解释器避免出现“命令行里安装了库但 VSCode 提示找不到 openpyxl”的问题。安装完成后可以查看版本信息python -c import openpyxl; print(openpyxl.__version__)本文示例在 Python 3.x 环境下编写openpyxl 版本以你实际安装的为准。Openpyxl 是一个较成熟的开源库常规用法在不同版本间变化不大教程重点演示处理思路和代码组织方式。2.2 环境清单参考项目建议内容操作系统Windows 10/11、macOS、Linux 均可Python3.8 及以上版本openpyxl3.x 版本目标文件格式.xlsx支持 .xlsm 时需要额外处理IDEVSCode、PyCharm 均可注意openpyxl 不能直接处理旧的.xls格式文件这类文件是 Excel 97-2003 工作簿。如果公司历史文件是.xls可以先在 Excel 中另存为.xlsx或者使用其他专门处理老格式的库。2.3 准备一个示例文件直接使用已有 Excel 文件也可以。为方便演示我先用 openpyxl 生成一张带简单公式的考核表后续所有保护、解除保护操作都围绕这个文件展开。# generate_demo.py from pathlib import Path from openpyxl import Workbook out_dir Path(demo) out_dir.mkdir(parentsTrue, exist_okTrue) wb Workbook() ws wb.active ws.title 考核表 headers [姓名, 部门, 基础分, 公式折算分, 最终分] ws.append(headers) rows [ [张三, 研发部, 80, C2*0.9, D2C2], [李四, 产品部, 75, C3*0.9, D3C3], ] for row in rows: ws.append(row) wb.save(out_dir / 员工考核表.xlsx) print(示例文件已生成: demo/员工考核表.xlsx)运行这段代码后目录下会生成demo/员工考核表.xlsx。D 列和 E 列的公式是之后“防止误修改”和“隐藏公式”的重点对象。3. openpyxl 中的保护机制拆解3.1 xlsx 文件里的保护标记.xlsx本质是一个 zip 压缩包里面保存了多个 XML 文件。每个工作表对应一个 XML 文件例如xl/worksheets/sheet1.xml。当你在 Excel 中开启工作表保护时实际上就是在对应的 XML 中写入了一个sheetProtection标记。openpyxl 通过worksheet.protection对象来读写这个标记。最基础的用法如下ws.protection.sheet True ws.protection.password 123456第一行表示“启用保护”第二行表示“设置保护密码”。保存文件后工作表的保护状态会写入文件。反过来把sheet属性设置为False再保存文件就相当于关闭了保护。3.2 “锁定单元格”与“保护工作表”的关系在理解保护之前要区分两个概念“单元格是否锁定”是单元格本身的一个属性描述的是这个单元格在保护状态下是否允许被修改。“工作表是否开启保护”是整张表的开关只有开启保护之后锁定属性才会生效。默认情况下新建 Excel 工作表的单元格都是“锁定”状态。如果直接给工作表开启保护那么全表单元格都会不可编辑。这在某些场景下过严因此需要先调整局部单元格的锁定状态让部分区域继续允许用户编辑。一个常见的需求是A、B、C 三列允许填写D、E 公式列不允许修改。这时可以先把 A:C 区域的单元格锁定属性设置为FalseD:E 保持默认锁定再开启工作表保护。这样保护开启后用户可以编辑 A:C但不能改动 D:E。另外还可以设置cell.protection.hidden True。这个属性配合工作表保护使用时可以隐藏公式内容。别人选中该单元格后即使能看到计算结果公式栏中也不会显示公式。3.3 密码保护的本质与安全边界需要提前说明一个容易误解的点工作表保护密码并非强加密。Excel 工作表保护的目的主要是防止协作过程中出现误操作而不是提供军用级数据安全。如果你需要保护的是真正机密的数据应该使用文件打开加密或企业内部的权限管理系统而不是只在 sheet 上加一个密码。在自动化脚本中密码通常通过代码参数传入。代码写好后不要将密码硬编码在仓库里更不要随便打印到日志中。处理文件前也要确认这些 Excel 文件是你自己创建的或者你已获得授权进行批量操作。4. 实战给 Excel 工作表添加保护4.1 最小保护代码先来看一个最简示例创建一个新工作簿直接给工作表加保护。# protect_sheet_demo.py from openpyxl import Workbook def protect_whole_sheet(path): wb Workbook() ws wb.active ws.title 考核表 ws.append([姓名, 部门, 基础分, 最终得分]) ws.append([张三, 研发部, 80, C210]) # 启用工作表保护 ws.protection.sheet True ws.protection.password 123456 wb.save(path) if __name__ __main__: protect_whole_sheet(考核表_protected.xlsx)运行后会生成考核表_protected.xlsx。用 Excel 打开这张表尝试编辑任意单元格Excel 会提示当前单元格受保护需要先取消保护。这段代码相当简短但已经有实际价值只要在生成报表时加上这几行导出的文件就自带“防误改保护”。4.2 允许用户编辑指定区域前面提到默认所有单元格都是锁定状态。如果希望用户只能编辑某些区域就需要先做局部解锁。下面实现一个稍微复杂一点的需求表头行不允许编辑。姓名、部门、基础分允许编辑。公式折算分、最终分不允许编辑。最终分公式需要在保护状态下隐藏。# protect_partial_demo.py from pathlib import Path from openpyxl import Workbook from openpyxl.styles import Font def generate_protected_file(path): wb Workbook() ws wb.active ws.title 考核表 headers [姓名, 部门, 基础分, 公式折算分, 最终分] ws.append(headers) for cell in ws[1]: cell.font Font(boldTrue) rows [ [张三, 研发部, 80, C2*0.9, D2C2], [李四, 产品部, 75, C3*0.9, D3C3], ] for row in rows: ws.append(row) # A:C 允许编辑D:E 保持默认锁定 for row in ws.iter_rows(min_row2, max_rowws.max_row, min_col1, max_col3): for cell in row: cell.protection.locked False # 隐藏公式列并确保公式列保持锁定 for row in ws.iter_rows(min_row2, max_rowws.max_row, min_col4, max_col5): for cell in row: cell.protection.locked True cell.protection.hidden True # 开启工作表保护 ws.protection.sheet True ws.protection.password 123456 Path(path).parent.mkdir(parentsTrue, exist_okTrue) wb.save(path) print(已生成受保护文件:, path) if __name__ __main__: generate_protected_file(demo/员工考核表_部分可编辑.xlsx)运行后你可以打开文件验证A、B、C 列中从第 2 行开始的内容可以编辑。D、E 列不能编辑。选中 E 列单元格时公式栏不显示公式只显示值。这套写法非常接近真实业务需求。比如做数据收集表时可以把“填写区域”解锁把“计算区域”锁定并隐藏从而减少数据被误改的风险。4.3 批量给多个 Excel 文件设置工作表保护如果只有一个文件手工操作 Excel 也很快。批处理才是 Python 的主要价值场景。下面这个脚本会扫描指定目录下的所有.xlsx文件逐个打开并将活动工作表设置保护。为降低误操作风险脚本不会覆盖原文件而是另存为带“已保护”后缀的新文件。# protect_dir.py import sys from pathlib import Path from openpyxl import load_workbook def protect_file(file_path: Path, password: str) - Path: 对单个 xlsx 文件的工作表设置保护另存为新文件。 wb load_workbook(file_path, keep_passwordTrue) ws wb.active # 这里只保护活动工作表 ws.protection.sheet True ws.protection.password password output_path file_path.with_name(file_path.stem _已保护.xlsx) wb.save(output_path) return output_path def main(): if len(sys.argv) 2: print(用法: python protect_dir.py 目录路径 [密码]) return target_dir Path(sys.argv[1]) password sys.argv[2] if len(sys.argv) 3 else 123456 if not target_dir.exists(): print(目录不存在:, target_dir) return for file_path in target_dir.glob(*.xlsx): # 跳过 Excel 临时文件 if file_path.name.startswith(~$): continue output_path protect_file(file_path, password) print(f已保护: {file_path.name} - {output_path.name}) if __name__ __main__: main()命令行运行示例python protect_dir.py demo 123456需要注意如果某个.xlsx文件正被 Excel 或 WPS 打开Python 在保存时可能报PermissionError。执行批处理前应关闭相关文件。5. 实战解除工作表的保护5.1 单文件解除保护解除保护的思路和添加保护相反把ws.protection.sheet设为False同时清空密码。这里有一个非常容易踩的坑openpyxl 打开文件时默认不会保留工作表保护密码如果你加载文件后直接保存原密码可能丢失。因此在需要读取并处理受保护文件时建议给load_workbook传入keep_passwordTrue。# unprotect_sheet.py from openpyxl import load_workbook def unprotect_single_file(path: str, output_path: str None): wb load_workbook(path, keep_passwordTrue) for ws in wb.worksheets: if ws.protection.sheet: ws.protection.sheet False ws.protection.password None print(f已解除工作表保护: {ws.title}) save_path output_path or path wb.save(save_path) print(f文件已保存到: {save_path}) if __name__ __main__: unprotect_single_file(demo/员工考核表_部分可编辑.xlsx, demo/员工考核表_已解除保护.xlsx)这段代码遍历了工作簿中的所有工作表而不是只处理活动工作表。只要某个工作表开启了保护都会统一关闭。如果你只希望处理当前活动表可以去掉 for 循环直接操作wb.active。再次强调该操作只适用于你本人创建、或已获得授权的 Excel 文件。不要在未授权的情况下尝试解除他人文件的保护。5.2 批量解除一个目录下的工作表保护与批量保护类似批量解除保护也只需遍历目录。下面的脚本会把处理结果输出为新的“已解除保护”文件避免覆盖原始文件。# unprotect_dir.py import sys from pathlib import Path from openpyxl import load_workbook def unprotect_file(file_path: Path) - Path: wb load_workbook(file_path, keep_passwordTrue) for ws in wb.worksheets: if ws.protection.sheet: ws.protection.sheet False ws.protection.password None output_path file_path.with_name(file_path.stem _已解除保护.xlsx) wb.save(output_path) return output_path def main(): if len(sys.argv) 2: print(用法: python unprotect_dir.py 目录路径) return target_dir Path(sys.argv[1]) if not target_dir.exists(): print(目录不存在:, target_dir) return for file_path in target_dir.glob(*.xlsx): if file_path.name.startswith(~$): continue output_path unprotect_file(file_path) print(f已解除保护: {file_path.name} - {output_path.name}) if __name__ __main__: main()运行方式python unprotect_dir.py demo5.3 工作簿结构保护的说明工作簿结构保护与工作表保护不同它控制的是“是否可以插入、删除、重命名工作表”等操作。OpenPyXL 对工作簿结构保护的写入支持并不像工作表保护那样直接因此若你确实需要设置工作簿结构保护更稳妥的方案之一是在 Windows 环境通过 xlwings 调用 Excel COM 对象。以下是参考代码思路运行环境要求为 Windows 且本机已安装 Excel 或支持 COM 的 WPS# protect_workbook_structure_demo.py import xlwings as xw def protect_workbook_structure(path: str, password: str): app xw.App(visibleFalse) try: book app.books.open(path) book.api.Protect(Passwordpassword, StructureTrue, WindowsFalse) book.save() book.close() finally: app.quit() if __name__ __main__: protect_workbook_structure(demo/员工考核表.xlsx, 123456)这种方案依赖本机 Excel 进程适合少量文件处理。若部署在 Linux 服务器上则无法使用该方式。项目落地前请先在小范围环境验证同时注意不要让 Excel 进程残留必要时在代码中增加异常清理逻辑。6. 运行结果验证与文件对比6.1 在 Excel 中验证效果在完成保护后最好打开文件做一次直观验证双击受保护工作表中的锁定单元格观察是否弹出“单元格受保护”的提示。尝试编辑允许编辑的区域确认可以正常输入。查看公式列确认公式栏未显示公式。尝试右键单击工作表标签查看“插入”“删除”“重命名”等操作状态。如果是批量文件可以抽查其中几个文件不要只验证第一个。6.2 用代码验证保护状态除了人工打开 Excel也可以用 openpyxl 快速打印每个工作表的保护状态。# inspect_protection.py from openpyxl import load_workbook def show_protection(path: str): wb load_workbook(path, keep_passwordTrue) print(f文件: {path}) for ws in wb.worksheets: print(f - 工作表: {ws.title}) print(f 保护状态: {ws.protection.sheet}) print(f 密码值: {ws.protection.password}) if __name__ __main__: show_protection(demo/员工考核表_已解除保护.xlsx)输出示例大致如下文件: demo/员工考核表_已解除保护.xlsx - 工作表: 考核表 保护状态: False 密码值: None如果保护状态显示True说明文件中仍存在保护显示False则说明已关闭。6.3 检查 xlsx 内部 XML如果要进一步确认保护标记是否写入文件可以借助 Python 的 zipfile 模块直接读取工作表 XML。这种方式不依赖 Excel 软件适合在服务器上快速确认文件状态。# check_xml_protection.py import re import zipfile def check_protection_tag(path: str, sheet_index: int 0): sheet_name fxl/worksheets/sheet{sheet_index 1}.xml with zipfile.ZipFile(path) as z: xml_content z.read(sheet_name).decode(utf-8) match re.search(rsheetProtection[^]*, xml_content) if match: print(发现保护标记:, match.group(0)) else: print(未发现 sheetProtection 标记) if __name__ __main__: check_protection_tag(demo/员工考核表_部分可编辑.xlsx)正常情况下受保护文件会在 XML 中输出类似sheetProtection ... /的内容解除保护后该标记会消失或变为空状态。7. 常见问题与排查思路7.1 文件打开加密与工作表保护的关系经常有人问我给 Excel 文件设置了打开密码为什么 openpyxl 读取后报错或者无法处理原因是“打开密码”属于文件容器级加密整个文件内容都被加密第三方库无法直接读取内部 XML。Openpyxl 只能处理未加密的.xlsx文件无法读取带打开密码的文件。如果你需要对带打开密码的文件做自动化处理原则上要先在 Excel 或 WPS 中打开文件、输入密码然后另存为无打开密码的版本再交给脚本处理。相关权限操作必须基于合法授权场景。7.2 常见报错对照表问题现象常见原因解决思路PermissionError: [Errno 13] Permission denied目标文件正被 Excel/WPS 打开占用或目录无写权限关闭文件后重试或将输出路径指向其他目录openpyxl.utils.exceptions.InvalidFileException文件不是 .xlsx 格式或者是一个损坏文件检查扩展名是否为 .xlsx必要时用 Excel 另存为新 .xlsx加载文件并保存后原保护密码丢失load_workbook 未设置 keep_passwordTrue在 load_workbook 中传入 keep_passwordTrue文件里有 xlsm 宏修改后宏丢失openpyxl 默认不保留 VBA 工程对 .xlsm 文件使用 load_workbook(..., keep_vbaTrue)打开 Excel 后提示文件已损坏原文件包含 openpyxl 无法完整保留的高级特性在测试副本上先验证避免直接处理生产文件单元格仍能被编辑未开启工作表保护或未把单元格锁定属性设为 True检查 ws.protection.sheet 是否为 True并确认目标单元格 locked 为 True7.3 中文路径与文件名的处理在 Windows 环境中openpyxl 本身支持中文路径和中文文件名。建议统一使用Path对象处理路径尽量不手动拼接字符串路径。from pathlib import Path from openpyxl import load_workbook path Path(demo) / 员工考核表.xlsx wb load_workbook(path)如果终端打印中文文件名出现乱码通常是命令行编码问题不影响文件本身。可以尝试调整终端代码页或使用英文文件名输出。8. 最佳实践与工程建议8.1 把“保护”当成一种协作策略工作表保护更适合被理解为“协作规则”而不是安全机制。在给团队定义报表规范时建议先明确哪些列是采集列允许协作人员填写。哪些列是公式列必须保持锁定。哪些列包含敏感逻辑需要隐藏公式。谁拥有解除保护的权限。把规则写清楚之后
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

207个WebGPU内核:浏览器本地AI推理从黑盒到算子可调优 2026/9/3 3:40:35

207个WebGPU内核:浏览器本地AI推理从黑盒到算子可调优

当 Hugging Face 发布 huggingface/kernels,说这个包提供 207 个 WebGPU 内核、用于浏览器本地 AI 推理时,很多人的第一反应可能是:又一个新库?我倒觉得,这更像一道分水岭。过去很长一段时间,浏览器里跑 AI…

阅读更多 →
ThinkPHP 6.0 + 微信小程序全栈答题系统:架构、性能优化与部署实战 2026/9/3 3:40:35

ThinkPHP 6.0 + 微信小程序全栈答题系统:架构、性能优化与部署实战

简介:这是一套基于ThinkPHP开发的后台答题类微信小程序完整源码,面向PHP后端开发者与小程序全栈学习者,解决在线题库管理、红包奖励发放、流量主收益对接等轻量级知识变现场景的快速落地问题。资源包为ZIP格式,大小45.71MB&#x…

阅读更多 →
基于Echarts的企业级数据驾驶舱:从20套源码到行业化实战 2026/9/3 3:40:35

基于Echarts的企业级数据驾驶舱:从20套源码到行业化实战

简介:本资源为20套基于ECharts的行业级数据可视化大屏与驾驶舱源码,面向前端开发者、数据分析师及企业BI实施人员,解决智慧物流、车联网、大数据运维与分析等场景中实时监控、指标聚合与交互式决策支持等核心需求。压缩包含1369个文件&#x…

阅读更多 →
解码HDAC6:云克隆全平台验证抗体如何赋能神经退行性疾病与肿瘤研究 2026/9/3 3:40:35

解码HDAC6:云克隆全平台验证抗体如何赋能神经退行性疾病与肿瘤研究

解码HDAC6:云克隆全平台验证抗体如何赋能神经退行性疾病与肿瘤研究在组蛋白去乙酰化酶(HDAC)家族中,HDAC6是一位特立独行的“多面手”。它不像其他HDAC成员那样主要定位于细胞核调控转录,而是主要活跃在细胞质中&#…

阅读更多 →
基于STM32与红外传感器的自动泊车小车:从硬件设计到算法实现 2026/9/3 3:40:35

基于STM32与红外传感器的自动泊车小车:从硬件设计到算法实现

简介:本资源是一份面向高校嵌入式课程设计与电子类实践教学的完整项目方案,聚焦基于STM32微控制器与红外传感器实现自动泊车功能,适用于具备C语言基础和初步硬件认知的本科生开展综合实训。压缩包共18个文件(124KB)&am…

阅读更多 →
基于AT89C51与DS18B20的温度监测系统:从时序原理到Proteus仿真实战 2026/9/3 3:37:35

基于AT89C51与DS18B20的温度监测系统:从时序原理到Proteus仿真实战

简介:这是一份面向单片机初学者与嵌入式课程实践者的完整温度监测系统仿真资源,聚焦AT89C51驱动DS18B20数字温度传感器并实时显示于LCD1602的典型应用。资源解决硬件接口设计、1-Wire协议实现、字符型液晶驱动及Proteus联合仿真调试等核心难点&#xff0…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞