者必知的openpyxl實戰(zhàn))
用 Python 批量處理 Excel 文件時“保護”這個需求經(jīng)常被誤解。很多剛接觸 openpyxl 的開發(fā)者以為只要在代碼里傳一個 passwordExcel 文件就無法被別人打開也有人寫完數(shù)據(jù)后直接把工作簿發(fā)給業(yè)務(wù)方結(jié)果對方順手改了公式第二天的統(tǒng)計就出錯了。真正的問題是Excel 里的保護并不是一個統(tǒng)一功能而是分成工作表保護、工作簿保護、文件打開密碼三個層次。它們解決的問題不同openpyxl 對它們的支持程度也不同。接下來的內(nèi)容圍繞一份帶公式的工作表展開。先說明三種保護機制分別控制什么再給出用 openpyxl 添加工作表保護、工作簿結(jié)構(gòu)保護、用 msoffcrypto 讀取加密文件的完整腳本然后把解除保護和常見報錯整理成排查清單。最后會給出適合生產(chǎn)環(huán)境的保護策略。1. 先分清 Excel 保護機制的三層含義1.1 工作表保護解決的是“表內(nèi)能不能改”工作表保護通常指 Excel 的 Review 菜單里的 Protect Sheet 功能。它的核心對象是單元格、行列、篩選、排序、對象和場景。在 Excel 的底層模型中每個單元格都有一個 Locked 屬性和 Hidden 屬性。單元格默認(rèn)情況下是 LockedTrue、HiddenFalse但這兩個屬性并不會立刻生效。只有當(dāng)工作表的保護開關(guān)被打開Locked 屬性才會起作用LockedTrue 的單元格不能被用戶編輯HiddenTrue 的單元格會把公式隱藏用戶選中該單元格時公式欄不會顯示公式內(nèi)容。這層保護適合用來防止誤改。例如一張員工獎金測算表目標(biāo)獎金和完成率在某個固定區(qū)域?qū)嶋H發(fā)放金額必須由公式計算那么可以把公式單元格鎖定并隱藏把完成率輸入?yún)^(qū)域解鎖。這樣用戶打開 Excel 后只有完成率可以修改。需要特別注意工作表保護不是加密。它不會阻止別人通過代碼讀取文件內(nèi)容也不會阻止技術(shù)能力較強的人手動解除保護。它