【Python/openpyxl】エクセル:ブックやシート・セルを保護・解除する方法

時計 2020.11.10 / 時計

【Python/openpyxl】エクセル:ブックやシート・セルを保護・解除する方法

仕事でお客様にエクセルで作成した請求書や申込書などを送付することは多々あります。
その際にシートの削除や誤ったセルへの入力、書式や数式が壊れるのを防ぐためにエクセルの保護を行うことがあります。

Pythonopenpyxlでは、シートやセルの保護を自動で行う機能が備わっています。

本記事ではopenpyxlでエクセル(ブック・シート・セル)の保護・解除をする方法について解説していきます。

openpyxlによるエクセルの保護・解除

ブックの保護・解除

ブックの保護

Workbookオブジェクトのsecurity属性に WorkbookProtectionオブジェクトを代入することでブックの保護を行えます。

WorkbookProtectionオブジェクトの作成にはWorkbookProtection()関数を使用します。

プログラムの先頭でWorkbookProtection()関数をインポートします。

from openpyxl.workbook.protection import WorkbookProtection

WorkbookProtection()関数のインポートですが、これをしなくてもブックの保護はできます。
ただインポートしない場合はWorkbookProtection()関数を使うためにはopenpyxl.workbook.protection.WorkbookProtection ()とすべて書く必要があります。

WorkbookProtection()関数の引数でパスワードの設定、保護の有無を設定できます。

  • workbookPassword=’パスワード’でパスワードの設定
  • lockStructure=Trueで保護の設定
import openpyxl
from openpyxl.workbook.protection import WorkbookProtection

wb = openpyxl.load_workbook('office54.xlsx')
wb.security = WorkbookProtection(workbookPassword='test', lockStructure=True)
wb.save('office54.xlsx')

上記プログラムを実行すると、対象のエクセルブックを保護できます。

openpyxlによるエクセルの保護実行

ブックの保護を解除

保護したブックの保護を解除する場合は、lockStructureをFalseにします。

wb.security = WorkbookProtection(workbookPassword='test', lockStructure=False)

シートの保護・解除

シートの保護

シートを保護するには、Worksheetオブジェクトのprotection属性に対して enable()メソッドを呼び出します。

ブックの保護では必ずパスワードの設定が必要でしたが、シートの保護の場合はパスワード設定は必須ではありません。

シートの保護にパスワードを設定するには、Worksheetオブジェクトのprotection.password属性にパスワードを与えます。

import openpyxl

wb = openpyxl.load_workbook('office54.xlsx')
ws = wb['Sheet']
ws.protection.password = 'test'
ws.protection.enable()
wb.save('office54.xlsx')

これでシートを保護することができますが、自動的にセルすべてに保護がかかるため、すべてのセルが入力不可となります。

そのため請求書や申込書などのユーザーが入力を必要とするエクセルファイルの場合、入力してほしいセルの保護を解除する操作が必要になります。

シートの保護を解除

シートの保護を解除したい場合は、disable()メソッドを使います。

ws.protection.disable()

セルの保護解除

任意のセルの保護を解除するために、Cellオブジェクトのprotection属性にProtectionオブジェクトを代入します。

Protectionオブジェクトの引数には保護解除を意味するlocked=Falseを渡します。
シートの保護を実行する前に、セルの保護解除を行います。

以下サンプルプログラムのようにfor文を使用してセルの保護解除をするといいです。

import openpyxl
from openpyxl.styles imort Protection

wb = openpyxl.load_workbook('office54.xlsx')
ws = wb['Sheet']

for rows in ws[B1:D10]:
	for cell in rows:
		cell.protection=Protection(locked=False)

ws.protection.password = 'test'
ws.protection.enable()
wb.save('office54.xlsx')

連載記事

Pythonによるエクセル操作の記事を定期的にアップしております。
ぜひエクセル仕事の効率化のためにご参照ください。