SJ blog
tools
A

信頼度ランク

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 を持たないPatternFillGradientFill は構造が異なるため、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)

xlsx_compare.py