使用Python保護和取消保護Excel工作表和工作簿的完整代碼

在企業(yè)數(shù)據(jù)管理和報表分發(fā)場景中,Excel 文件往往包含敏感信息或關(guān)鍵公式,需要防止未經(jīng)授權(quán)的修改。手動為每個工作表設(shè)置保護密碼在文件數(shù)量較少時可行,但面對批量處理或自動化生成報表的需求,這種方式顯然不夠高效。
通過 Python 編程實現(xiàn) Excel 工作表和工作簿的保護與解保護,可以將安全策略無縫集成到文檔生成和分發(fā)流程中。本文將介紹如何使用 Python 對工作表進行密碼保護、鎖定特定單元格和行列、設(shè)置可編輯區(qū)域、隱藏公式,以及解除保護。
環(huán)境準備
本文使用 Spire.XLS for Python 庫操作 Excel 文件,通過 pip 安裝:
pip install Spire.XLS
在腳本中導(dǎo)入所需模塊:
from spire.xls import * from spire.xls.common import *
保護工作表的基礎(chǔ)概念
Excel 的保護機制分為兩個層級:
- 工作表保護:限制對工作表中單元格內(nèi)容的編輯,可以設(shè)置密碼,也可以選擇性地允許某些操作(如排序、篩選等)。
- 工作簿保護:限制對工作簿結(jié)構(gòu)的修改,防止用戶添加、刪除或重命名工作表。
在 Spire.XLS 中,工作表保護通過 Protect() 方法實現(xiàn),工作簿保護則通過 Workbook.Protect() 方法實現(xiàn)。每個單元格都有一個 Locked 屬性,默認情況下所有單元格都是鎖定狀態(tài),但只有在啟用工作表保護后,鎖定才會生效。
保護工作表
最簡單的保護方式是為整個工作表設(shè)置密碼。啟用保護后,所有單元格默認處于鎖定狀態(tài),用戶無法編輯任何內(nèi)容:
from spire.xls import *
from spire.xls.common import *
# 創(chuàng)建工作簿并加載文件
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 表示禁止所有操作。也可以根據(jù)需要選擇更細粒度的保護類型,如僅禁止插入行、刪除列等特定操作。
鎖定特定單元格
在多數(shù)場景中,并不需要鎖定所有內(nèi)容,而是只保護關(guān)鍵的公式單元格或匯總數(shù)據(jù)。實現(xiàn)這一目標的關(guān)鍵在于:先將所有單元格設(shè)為未鎖定,再將需要保護的單元格設(shè)為鎖定,最后啟用工作表保護。
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 將 B3 單元格設(shè)為鎖定
sheet.Range["B3"].Style.Locked = True
# 將 C3 單元格設(shè)為未鎖定(即使工作表受保護也可編輯)
sheet.Range["C3"].Style.Locked = False
# 啟用工作表保護
sheet.Protect("TestPassword", SheetProtectionType.All)
workbook.SaveToFile("LockSpecificCells.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
這種方式適用于表單類文檔——大部分字段允許用戶填寫,只有公式和標題等關(guān)鍵區(qū)域需要保護。
鎖定特定行或列
當需要保護整行或整列數(shù)據(jù)時,可以通過遍歷設(shè)置行或列的鎖定狀態(tài)。以下示例先解鎖所有行,然后僅鎖定第 3 行:
workbook = Workbook()
workbook.CreateEmptySheet()
sheet = workbook.Worksheets[0]
# 解鎖所有行
for i in range(0, 255):
sheet.Rows[i].Style.Locked = False
# 鎖定第 3 行
sheet.Rows[2].Text = "Locked"
sheet.Rows[2].Style.Locked = True
# 啟用保護
sheet.Protect("123", SheetProtectionType.All)
workbook.SaveToFile("LockSpecificRow.xlsx", ExcelVersion.Version2013)
鎖定特定列的方式類似,以下示例鎖定第 4 列(D 列):
workbook = Workbook()
workbook.CreateEmptySheet()
sheet = workbook.Worksheets[0]
# 解鎖所有行
for i in range(0, 255):
sheet.Rows[i].Style.Locked = False
# 鎖定第 4 列
sheet.Columns[3].Text = "Locked"
sheet.Columns[3].Style.Locked = True
# 啟用保護
sheet.Protect("123", SheetProtectionType.All)
workbook.SaveToFile("LockSpecificColumn.xlsx", ExcelVersion.Version2013)
設(shè)置可編輯區(qū)域
另一種更靈活的方式是在保護工作表的同時,指定某些區(qū)域為"允許編輯范圍"。用戶可以在這些區(qū)域內(nèi)自由編輯,而工作表其他部分仍然受保護:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 定義允許編輯的區(qū)域
sheet.AddAllowEditRange("EditableRanges", sheet.Range["B4:E12"])
# 保護工作表
sheet.Protect("TestPassword", SheetProtectionType.All)
workbook.SaveToFile("ProtectedWithEditableRange.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
AddAllowEditRange() 方法接受兩個參數(shù):區(qū)域名稱和區(qū)域范圍。這種方式比逐個設(shè)置單元格的 Locked 屬性更加直觀,特別適合需要在受保護表格中開放數(shù)據(jù)錄入?yún)^(qū)域的場景。
保護工作簿結(jié)構(gòu)
除了工作表級別的保護,還可以對工作簿整體結(jié)構(gòu)進行保護,防止用戶添加、刪除或重命名工作表:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
# 保護工作簿結(jié)構(gòu)
workbook.Protect("e-iceblue")
workbook.SaveToFile("ProtectWorkbook.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
工作簿保護與工作表保護可以同時使用,實現(xiàn)從整體結(jié)構(gòu)到單元格內(nèi)容的多層防護。
隱藏公式
在包含復(fù)雜計算公式的報表中,有時需要讓用戶看到計算結(jié)果但不能查看或修改公式本身。通過設(shè)置 IsFormulaHidden 屬性并啟用保護,可以隱藏工作表中的所有公式:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 隱藏已使用區(qū)域中的所有公式
sheet.AllocatedRange.IsFormulaHidden = True
# 啟用工作表保護以使隱藏生效
sheet.Protect("e-iceblue")
workbook.SaveToFile("HideFormulas.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
需要注意的是,IsFormulaHidden 屬性只有在啟用工作表保護后才會生效。單獨設(shè)置該屬性不會隱藏公式。
解除工作表保護
解除保護需要提供正確的密碼。使用 Unprotect() 方法并傳入設(shè)置保護時使用的密碼即可:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("ProtectedSheet.xlsx")
sheet = workbook.Worksheets[0]
# 使用密碼解除保護
sheet.Unprotect("e-iceblue")
workbook.SaveToFile("UnprotectedSheet.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
如果工作表沒有設(shè)置密碼保護,可以直接調(diào)用 Unprotect() 方法無需傳入?yún)?shù)。
實用技巧
保護與可編輯區(qū)域的組合策略:在構(gòu)建數(shù)據(jù)錄入模板時,可以先用 AddAllowEditRange() 開放輸入?yún)^(qū)域,再保護工作表。這樣既能防止用戶意外修改表頭和公式,又不影響正常的業(yè)務(wù)數(shù)據(jù)錄入。
批量保護多個工作表:遍歷工作簿中的所有工作表并統(tǒng)一設(shè)置保護密碼:
for i in range(workbook.Worksheets.Count):
sheet = workbook.Worksheets[i]
sheet.Protect("CommonPassword", SheetProtectionType.All)
密碼安全建議:在生產(chǎn)環(huán)境中,密碼不應(yīng)硬編碼在源代碼中。建議使用環(huán)境變量或配置文件管理密碼,并選擇足夠強度的密碼以防止暴力 破解。
總結(jié)
本文介紹了使用 Python 對 Excel 工作表和工作簿進行保護的完整方法,包括基礎(chǔ)保護、鎖定特定單元格和行列、設(shè)置可編輯區(qū)域、隱藏公式以及解除保護等操作。這些功能在自動化報表生成、批量文件處理和文檔安全管理等場景中具有廣泛的實用價值。
結(jié)合條件格式、數(shù)據(jù)驗證等功能,可以構(gòu)建出安全性更高、功能更完善的 Excel 自動化處理方案。
到此這篇關(guān)于使用Python保護和取消保護Excel工作表和工作簿的完整代碼的文章就介紹到這了,更多相關(guān)Python保護和取消保護Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
10張動圖學(xué)會python循環(huán)與遞歸問題
今天為大家整理了十張動圖GIFS,有助于認識循環(huán)、遞歸、二分檢索等概念的具體運行情況。代碼實例以Python語言編寫,非常不錯,感興趣的朋友跟隨小編一起學(xué)習吧2021-02-02
關(guān)于windos10環(huán)境下編譯python3版pjsua庫的問題
pjsua默認綁定的python版本是python 2.4,使用起來有諸多限制,希望可以使用python3調(diào)用pjsua的庫實現(xiàn)軟電話的基礎(chǔ)功能。這篇文章主要介紹了windos10環(huán)境下編譯python3版pjsua庫,需要的朋友可以參考下2021-10-10
基于Python中capitalize()與title()的區(qū)別詳解
下面小編就為大家分享一篇基于Python中capitalize()與title()的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12

