この記事について
この記事では xlrd
という、 Python からエクセルファイルを読み込むライブラリを使って、パスワードの掛かったエクセルファイルを読み込む方法について紹介します。なお、パスワード自体は 既知 であるという前提です。
xlrd
単体では、パスワードの掛かったエクセルを開くことができないため、この記事では msoffcrypto-tool
という、別の Python ライブラリを使ってパスワードを解除し、通常のワークブックの状態に戻してから xlrd
で読込むという手順を踏みます。
環境
自分の環境は以下の通りでしたが、ヴァージョンが違っても概ね動くと思います。
- Python 3.6.8
- xlrd 1.2.0
- msoffcrypto-tools 4.6.4
- macOS Mojave 10.14.3
スニペット
# -*- coding: utf-8 -*-
import tempfile
import xlrd
import msoffcrypto
def open_workbook(workbook_file_path, password=None):
if password is None:
wb = xlrd.open_workbook(workbook_file_path)
else:
with open(workbook_file_path, 'wb') as fin,\
tempfile.TemporaryFile() as tfp:
encrypted = msoffcrypto.OfficeFile(fin)
encrypted.load_key(password=password)
encrypted.decrypt(tfp)
tfp.seek(0)
wb = xlrd.open_workbook(file_content=tfp.read())
return wb
open_workbook
関数に password
引数を渡すと、 msoffcrypto-tool
でパスワードを使った復号化を行い、内容をテンポラリファイルに書き込みます。そして xlrd
に復号化したテンポラリファイルを渡しています。 xlrd.open_workbook
関数は通常ファイルパスの文字列を渡しますが、 file_content
キーワード引数を渡すとバイト列をそのまま読み込んでくれるようです。
参考文献
- nolze/msoffcrypto-tool: A Python tool and library for decrypting MS Office files with passwords or other keys, https://github.com/nolze/msoffcrypto-tool
- API Reference — xlrd 1.1.0 documentation, https://xlrd.readthedocs.io/en/latest/api.html
- python-excel/xlrd: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files, https://github.com/python-excel/xlrd