在企业报表分发和数据自动化场景中,Excel文件常包含公式或敏感字段,需要编程方式批量设密与保护。Python通过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[0]
- 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[0]
- 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[0]
- for i in range(0, 255):
- sheet.Rows[i].Style.Locked = False
- sheet.Rows[2].Text = "Locked"
- sheet.Rows[2].Style.Locked = True
- sheet.Protect("123", SheetProtectionType.All)
- workbook.SaveToFile("LockSpecificRow.xlsx", ExcelVersion.Version2013)
复制代码
锁定列类似,将 Columns[3] 设为锁定:
- workbook = Workbook()
- workbook.CreateEmptySheet()
- sheet = workbook.Worksheets[0]
- for i in range(0, 255):
- sheet.Rows[i].Style.Locked = False
- sheet.Columns[3].Text = "Locked"
- sheet.Columns[3].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[0]
- 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[0]
- 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[0]
- sheet.Unprotect("e-iceblue")
- workbook.SaveToFile("UnprotectedSheet.xlsx", ExcelVersion.Version2013)
- workbook.Dispose()
复制代码
若工作表无密码,直接调用无需参数。
八、实用技巧
批量保护所有工作表:
- for i in range(workbook.Worksheets.Count):
- workbook.Worksheets[i].Protect("CommonPassword", SheetProtectionType.All)
复制代码
密码管理:生产环境建议通过环境变量或配置文件读取,避免硬编码。
结合上述方法,可构建兼具数据录入开放性与关键字段保护的 Excel 自动化模板。 |