openpyxlでエクセルファイルを編集しているんだけど、
特定のシートだけ、書き換えできないようにしたい…。
なるほど…。シートの保護が最適かもしれませんね。
では今回は、「openpyxlでシートの保護を適用する方法」を
できるだけわかりやすく解説いたします。
「シートの保護を解除する方法」も紹介いたしますので、
ぜひ最後まで読んでいってください。
openpyxlでシートの保護を適用する方法
「protection.sheet」を使います。まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
ws.protection.sheet = True
wb.save('C:/Utatane/output.xlsx')
ws.protection.sheet = True
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~ブック・シートの取得
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
上記コードにて、「インポート」と既存のエクセルファイルの「ブックの取得」「シートの取得」を行っています。
詳細は、「インストール方法」の記事をご参考ください。
今回は「Sheet1」を取得し、保護をかけます。
既存ファイルを取得する以外に、エクセルファイルを新規作成する方法もあります。
下記記事をご参考ください。
シートの保護
ws.protection.sheet = True
上記コードにて、「シートの保護」を行っております。
【コードの解説】
取得したシートが入った変数(今回はws)に続けて、「.protection.sheet = True」を書きます。
これで「Sheet1」の保護が有効になりました。
実行後に出力されたファイルを、試しに編集してみましょう。
エラーが発生しました。シートの保護が有効になっている証拠です。
保護したのは「Sheet1」だけですので、「Sheet2」は編集できます。
しかしながら、この状態では勝手にシートの保護を解除されてしまう場合があります。
エクセル内メニューの「校閲」→「シート保護の解除」で誰でも解除できます。
シートの保護が解除され、下図のように編集できるようになってしまいました。
そこで、勝手に解除されないように、パスワードを設定する方法を紹介いたします。
シートの保護を解除されないようにパスワードを設定
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
ws.protection.sheet = True
ws.protection.password = 'Utatane'
wb.save('C:/Utatane/output.xlsx')
前項から「7行目」が追加されただけです。
ws.protection.password = 'Utatane'
【コードの解説】
取得したシートが入った変数に続けて、「.protection.password」を書きます。
そして「=(イコール)」を書いたら、設定するパスワードを書いて完了です。
パスワードは「’(クォーテーション)」で囲ってください。
1~24文字までなら設定できます。
大文字と小文字が区別されますので、ご注意ください。
これで、シートの保護を勝手に解除しようとすると、パスワードを求められるようになります。
前項同様に「校閲」→「シート保護の解除」を選択してみます。
上図のような画面が表示されました。
設定したパスワードを入力しないと解除できないというわけです。
パスワード入力に成功すると、下図のように編集できるようになります。
今回は手動でシートの保護を解除いたしましたが、
openpyxlでシートの保護を解除する方法を次項で紹介いたします。
openpyxlでシートの保護を解除する方法
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
ws.protection.sheet = False
wb.save('C:/Utatane/output.xlsx')
上記コードにて、シートの保護を解除することができます。
前々項から、6行目の右辺が変わっただけです。
- ws.protection.sheet = True:シートの保護を適用
- ws.protection.sheet = False:シートの保護を解除
「False」にすると、シートの保護を解除できます。お試しください。
これまで、「シートの保護」に関することを解説してきましたが、ブック全体を保護する方法は無いのでしょうか?
次項をご覧ください。
ブックを保護するには?
ブックを保護するには、下記コードを実行してください。
import openpyxl
from openpyxl.workbook.protection import WorkbookProtection
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
wb.security = WorkbookProtection()
wb.security.lockStructure = True
wb.save('C:/Utatane/output.xlsx')
これでブックが保護された状態になり、「シートの追加・削除・移動」ができなくなります。
しかしながら、シートの編集は可能です。
全シートを編集できないようにするには、シートの保護を全シートにかけるか、下記記事で解説している読み取り専用にする方法を試してみてください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでシートの保護をする方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!