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