pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、ブックやシートのセルの保護に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。
ブックを保護する
WorkbookProtectionオブジェクトをWorkbook.securiti属性に代入することで
ブックを保護する事が出来ます。
また、パスワードが必須なのでこちらも一緒に設定します。
from openpyxl import load_workbook
from openpyxl.workbook.protection import WorkbookProtection
wb = load_workbook('資料.xlsx')
# ブックを保護
wb.security = WorkbookProtection(
workbookPassword='test', lockStructure=True
)
wb.save('資料_保護済.xlsx')
これでブック「資料」を保護する事が出来ました。
シートのセルを保護する
Protection.enableメソッドを使うとシートを保護する事が出来ます。
パスワードは任意なのですが、変えられても困るので設定しちゃいます。
ws.protection.password = '任意のパスワード'
ws.protection.enable()
ただ、これだけだとすべてのセルが変更できないので
セルのprotection属性に保護を表すProtectionオブジェクトを代入します。
cell.protection = Protection(locked=False)
こちらを使って任意のセルだけ入力可能な日報を作ります。
from openpyxl import load_workbook
from openpyxl.styles import Protection
wb = load_workbook('日報.xlsx')
ws = wb['原紙']
# セルB3~G22に処理を行う
for rows in ws['B3:G22']:
for cell in rows:
# セル入力が出来るようにする
cell.protection = Protection(locked=False)
# シートの保護を解除する際のパスワードを設定
ws.protection.password = 'test'
# シートを保護
ws.protection.enable()
wb.save('日報_保護済.xlsx')
今回のように解りやすい保護設定範囲ではなく
シートの内容によっては保護する部分が点在していたりすることもあるので
一度決めてしまえばミスなく設定し続けられるのは便利だなと思います。
余談:複数のセルを取得する方法
多数のセルに対して同じ処理を行う場合は結構あるので
ws['B3:G22']のような記述方法以外にも、何かないか調べてみました。
- ws['列名']:指定した列のセルを取得。ws['A']だったらA列のセル全部
- ws['列名:列名']:指定した列範囲のセルを取得。ws['A:D']だったらA~D列のセル全部
- ws['行番号']:指定した行のセルを取得。ws['1']だったら1行目のセル全部
- ws['行番号:行番号']:指定した行範囲のセルを取得。ws['1:5']だったら1~5行のセル全部
- ws['セル番地:セル番地']:指定したセル番地の範囲のセルを取得。ws['A5:D10']だったらA5~D10のセル
たぶん、ws['セル番地:セル番地']がメインだと思うのですが念のため。
私はよく計算式の入っているセルを上書きしたことに気が付かず後でワタワタするのですが
対策のために保護をかけようと思うと意外に重労働で諦めていました。
これからは、もう少し楽をしよう・・・。