脚本专家 发表于 6 天前

Python+Spire.XLS:Excel工作簿保护与单元格锁定实战指南

在企业报表分发和数据自动化场景中,Excel文件常包含公式或敏感字段,需要编程方式批量设密与保护。Python通过Spire.XLS库可实现对工作表和单元格的细粒度保护。本文以实例演示密码设置、锁定特定区域、隐藏公式和解锁操作。


pip install Spire.XLS


导入模块:


from spire.xls import *
from spire.xls.common import *


Excel保护分两级:工作簿保护(阻止添加/删除工作表)和工作表保护(限制单元格编辑)。Spire.XLS中,工作表保护通过 Protect() 方法实现,工作簿保护通过 Workbook.Protect() 方法实现。每个单元格有 Locked 属性,仅在启用保护后生效。

一、基础工作表密码保护

为整个工作表设置密码后所有单元格均被锁定:


workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets
sheet.Protect("MyPassword", SheetProtectionType.All)
workbook.SaveToFile("ProtectSheet.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


SheetProtectionType.All 禁止所有操作,也可选 InsertRows、DeleteColumns 等细粒度类型。

二、锁定特定单元格

先解锁所有单元格,再锁定关键区域:


workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets
sheet.Range["B3"].Style.Locked = True
sheet.Range["C3"].Style.Locked = False
sheet.Protect("TestPassword", SheetProtectionType.All)
workbook.SaveToFile("LockSpecificCells.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


适用于表单类文档:开放填写区,保护公式和标题。

三、锁定整行或整列

遍历行/列设置锁定状态。以下先解锁所有行再锁定第3行:


workbook = Workbook()
workbook.CreateEmptySheet()
sheet = workbook.Worksheets
for i in range(0, 255):
    sheet.Rows.Style.Locked = False
sheet.Rows.Text = "Locked"
sheet.Rows.Style.Locked = True
sheet.Protect("123", SheetProtectionType.All)
workbook.SaveToFile("LockSpecificRow.xlsx", ExcelVersion.Version2013)


锁定列类似,将 Columns 设为锁定:


workbook = Workbook()
workbook.CreateEmptySheet()
sheet = workbook.Worksheets
for i in range(0, 255):
    sheet.Rows.Style.Locked = False
sheet.Columns.Text = "Locked"
sheet.Columns.Style.Locked = True
sheet.Protect("123", SheetProtectionType.All)
workbook.SaveToFile("LockSpecificColumn.xlsx", ExcelVersion.Version2013)


四、设置可编辑区域(允许编辑范围)

AddAllowEditRange 方法直接定义解锁区域,无需逐个设置 Locked:


workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets
sheet.AddAllowEditRange("EditableRanges", sheet.Range["B4:E12"])
sheet.Protect("TestPassword", SheetProtectionType.All)
workbook.SaveToFile("ProtectedWithEditableRange.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


五、保护工作簿结构

禁止用户增删或重命名工作表:


workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
workbook.Protect("e-iceblue")
workbook.SaveToFile("ProtectWorkbook.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


可同时使用工作表保护与工作簿保护实现多层防护。

六、隐藏公式

设置 IsFormulaHidden 属性并启用工作表保护:


workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets
sheet.AllocatedRange.IsFormulaHidden = True
sheet.Protect("e-iceblue")
workbook.SaveToFile("HideFormulas.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


注意:该属性仅在保护生效时才隐藏公式。

七、解除工作表保护

传入密码调用 Unprotect():


workbook = Workbook()
workbook.LoadFromFile("ProtectedSheet.xlsx")
sheet = workbook.Worksheets
sheet.Unprotect("e-iceblue")
workbook.SaveToFile("UnprotectedSheet.xlsx", ExcelVersion.Version2013)
workbook.Dispose()


若工作表无密码,直接调用无需参数。

八、实用技巧

批量保护所有工作表:


for i in range(workbook.Worksheets.Count):
    workbook.Worksheets.Protect("CommonPassword", SheetProtectionType.All)


密码管理:生产环境建议通过环境变量或配置文件读取,避免硬编码。

结合上述方法,可构建兼具数据录入开放性与关键字段保护的 Excel 自动化模板。

热心网友6 发表于 6 天前

Re: Python+Spire.XLS:Excel工作簿保护与单元格锁定实战指南

感谢分享,非常实用的教程!示范代码清晰,涵盖了基本保护、锁定特定单元格、行、列,以及允许编辑区域和工作簿保护。请问在锁定单元格时,如果工作表中已有一些单元格被合并,会导致问题吗?另外,Spire.XLS是免费的吗?

热心网友6 发表于 6 天前

Re: Python+Spire.XLS:Excel工作簿保护与单元格锁定实战指南

感谢楼主的详细教程!最近正好在处理批量报表保护的自动化任务,这篇实战指南把常见的保护场景都覆盖到了,特别是“锁定特定单元格”和“可编辑区域”部分,思路非常清晰。之前用openpyxl处理类似的场景需要手动设置单元格格式,Spire.XLS的AddAllowEditRange方法确实省事不少。请问楼主,SheetProtectionType除了All和列出的那几个,还有没有其他常用的细粒度类型可以推荐?另外,在隐藏公式时,如果工作表已经设置了保护,再修改IsFormulaHidden还需要重新保护吗?期待更多分享。

热心网友6 发表于 6 天前

Re: Python+Spire.XLS:Excel工作簿保护与单元格锁定实战指南

感谢楼主分享,非常实用的教程!对 Spire.XLS 保护功能的几种常见场景讲得很清楚,特别是锁定指定单元格和用 AddAllowEditRange 设置可编辑区域的方法,比逐个设置 Locked 属性要方便很多。想问下,如果工作表中已经有单元格合并的情况,锁定和解锁操作会不会受影响?另外,有没有办法在保护工作表的同时保留筛选或数据验证功能?
页: [1]
查看完整版本: Python+Spire.XLS:Excel工作簿保护与单元格锁定实战指南