信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
openpyxlとは ── Pythonから Excel を操作するライブラリ入門
openpyxlの基本から実践まで。インストール・読み書き・書式設定を解説し、2つのブックを完全比較できるGUIツールのコードを公開する。
一言結論
openpyxlはPythonからxlsxを読み書きできる定番ライブラリ。追加ライブラリなしでGUIツールまで作れる。
基本の読み書き
import openpyxl
# ── 読み込み
wb = openpyxl.load_workbook("report.xlsx")
ws = wb["Sheet1"]
print(ws["A1"].value) # セルの値を取得
print(ws.cell(2, 3).value) # 行・列番号で取得(1始まり)
# ── 書き込み
wb2 = openpyxl.Workbook()
ws2 = wb2.active
ws2["A1"] = "hello"
ws2.cell(2, 1, value=42)
wb2.save("output.xlsx")
数式・書式の扱い
# 数式は文字列のまま書き込む
ws["B1"] = "=SUM(A1:A10)"
# data_only=True で計算済み値を読む(Excelで一度開いたファイルのみ有効)
wb_values = openpyxl.load_workbook("report.xlsx", data_only=True)
# 書式設定
from openpyxl.styles import Font, PatternFill, Alignment
ws["A1"].font = Font(bold=True, size=14, color="FF0000")
ws["A1"].fill = PatternFill(fill_type="solid", fgColor="FFFF00")
ws["A1"].alignment = Alignment(horizontal="center", wrap_text=True)
行・列の操作
# 行・列の挿入・削除
ws.insert_rows(3) # 3行目に空行を挿入
ws.delete_cols(2) # B列を削除
# 行高・列幅
ws.row_dimensions[1].height = 30
ws.column_dimensions["A"].width = 20
# マージセル
ws.merge_cells("A1:C1")
ws.unmerge_cells("A1:C1")
落とし穴と注意点
read_only=True は書式情報を取得できない。条件付き書式・データバリデーション・シート設定などを扱う場合は通常モードで読み込む必要がある。
data_only=True は Excel で一度計算したキャッシュを読む。openpyxl 自体は数式を計算しないため、一度も Excel で開いていないファイルではセル値が None になることがある。
value or "" で 0 が消える。0 or "" は "" になるので、セル値を文字列化するときは str(v) if v is not None else "" を使う。
GradientFill は fgColor/bgColor を持たない。PatternFill と GradientFill は構造が異なるため、hasattr(fl, "stop") で分岐して処理する必要がある。
xlsx 完全比較ツール
2つのブックをシート単位で完全比較する GUI ツールのコードを置いておく。
比較対象(openpyxl で取得できるものをすべて網羅):
- 値・数式: 0/False を空文字と区別、”=” 始まりを数式として分類
- 書式: フォント(vertAlign・outline・shadow・family・charset・scheme 含む)、塗り(GradientFill 対応)、罫線(diagonalUp/Down 含む)、配置(readingOrder 含む)、数値書式、保護
- シート設定: 印刷範囲・印刷タイトル行列・フリーズ・タブ色(theme/indexed 対応)、ページ設定(全属性)・ページ余白・印刷オプション・ヘッダーフッター(奇数/偶数/先頭ページ)・シート保護・ズームレベル・マージセル・条件付き書式(ルール内容完全比較)・データバリデーション(属性ベース)・テーブル・グリッド線表示
- 行・列: 高さ・幅・非表示・アウトラインレベル(グループ化)
- セル: コメント(テキスト・作者)
- ブック: 名前定義
行や列が増減しているシートには LCS(最長共通部分列)アルゴリズム で WinMerge 相当のシフト対応を行い、追加・削除された行列を検出する。
比較はバックグラウンドスレッドで実行され、進捗バーと x/X カウントでリアルタイムに確認できる。結果はキーワード検索・種別フィルター・カラムヘッダクリックでのソートに対応。
動作環境: Python 3.10 以上 + openpyxl (pip install openpyxl)