pythonでExcelを操作できるライブラリはいくつかありますが、
私が調べた中で唯一「.xlsm」の拡張子を扱うことのできたライブラリOpenpyxlについて記事にします。
Openpyxl概要
公式ドキュメント:https://openpyxl.readthedocs.io/en/stable/index.html
最新バージョン:2.6.2(2019/9/27現在)
ライセンス:MITライセンス
対応officeバージョン:office2010~
xlsx、xlsm等には対応できるが、xlsは非対応。
インストール
以下のように、pipコマンドでインストールするだけ。
pip install openpyxl
Excelを開いてみる
from openpyxl import Workbook, load_workbook
# xlsm形式ファイルを開く場合
wb = load_workbook(filename="Excelファイルのパス", read_only=False, keep_vba=True)
ws = self.wb['シート名']
最低限、Excelファイルのパスを指定してload_workbookの引数に渡せば、pythonでExcelファイルを開くことはできる。
read_only = False
読み取り専用(True)か書き込み可能(False)かを指定する。
keep_vba = True
開いたExcelのVBマクロを読み込むかどうかを指定する。
読み込む → True、読み込まない → False
※ここで、Falseを指定すると、保存時にVBマクロが動かなくなるので、保存後もマクロを有効にしたい場合は、Trueを指定する。
Excelを編集してみる
# 書き込み
ws['A1'] = 'A1'
# R1C1形式でも指定可能
# 列数、行数は1から開始
ws.cell(row=2, column=3).value = 'C2'
# 読み取り
data1 = ws['A1']
data2 = ws.cell(row=2, column=3).value
# Bookの保存
wb.save("保存先Excelファイルのパス")
簡単な読み書きだけであれば、以上のことを覚えておくだけで完結する。
より複雑な編集をしてみる
以下にただの読み書きよりも少し高度なExcel編集をTIPSとして羅列する。
まず、importしなければならないライブラリ
from openpyxl.workbook.protection import WorkbookProtection
from openpyxl.styles.borders import Border, Side
from openpyxl.styles import Alignment
from openpyxl.styles.fonts import Font
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.styles.fills import PatternFill
以下、ソースコード抜粋
# 罫線の適用
# 罫線を定義
thinside = Side(style='thin', color='000000')
thisborder = Border(top=thinside, bottom=thinside, left=thinside, right=thinside)
ws['A1'].border = thisborder
# セルの塗りつぶし
# 塗りつぶしルールを定義
fill = PatternFill(patternType='solid', start_color='ffff0000', end_color='ffff0000')
ws['A1'].fill = fill
# ズームの変更
ws.sheet_view.zoomScale = 75 # 75%に変更
# データの入力規則の適用
# 選択肢A~Dで空白を許可する
data_valid = DataValidation(type='list', formula1='"選択肢A,選択肢B,選択肢C,選択肢D"', allow_blank=True)
data_valid.add(ws['A1'])
# シートの保護
ws.protection.enable()
# ブックの保護
wb.security = WorkbookProtection()
wb.security.lockStructure = True
さいごに
今回は、xlsmのファイルを扱うためにOpenpyxlを使用したが、
他のExcel操作のpythonライブラリも試して、
各ライブラリの比較とかできたらよいなと心の片隅に思った…(思っただけ)