PythonでExcel自動化!openpyxl入門ガイド【2025年最新版】

PythonでExcelを操作する:openpyxlの基本的な使い方【初心者】
  • URLをコピーしました!

大量コピー&ペーストや毎月の帳票づくりを手作業で続けるのは大変ですよね。

本記事では 「最短5分で動くサンプル」→「実務ユースケース」→「エラー対処」 の流れで、
Excel操作ライブラリ openpyxl の基本を解説します。

対象読者
  • Excelマクロに限界を感じ、Pythonで効率化したい初〜中級者
  • データ変換・レポート作成を“毎月のルーチン”から“ワンクリック”に変えたい方
目次

openpyxlとは? :できることと他ライブラリ比較

  • Office Open XML(.xlsx/.xlsm など)の読み書き専用ライブラリ
  • VBAやCOMを使わないため、Windows/macOS/Linux どこでも実行可能
  • 罫線・書式・グラフ・画像の挿入まで対応
  • Pandas・Seleniumと組み合わせれば、ブラウザ自動操作やデータ分析との連携も自在

詳しくは公式ドキュメントを参照ください。openpyxl.readthedocs.io

インストールと環境チェック

pip install openpyxl

執筆時点(2025年7月)の最新安定版は v3.1.5 です。PyPI

バージョンを確認するには:

import openpyxl
print(openpyxl.__version__) # → 3.1.5

最短5分で動くサンプル ― 新規ブック作成

from openpyxl import Workbook

wb = Workbook() # 新規ブックを生成
ws = wb.active # アクティブシート取得
ws["A1"] = "Hello openpyxl!"# セル書き込み
wb.save("hello.xlsx") # ファイル保存
print("Excelを自動生成しました ✅")
POINT
  1. Workbook() で空のブックを作成
  2. ws = wb.active で既定シートを取得
  3. セルはA1形式で直接アクセス

既存ファイルを開いて編集

from openpyxl import load_workbook

wb = load_workbook("hello.xlsx")
ws = wb.active
print(ws["A1"].value)            # → Hello openpyxl!

ws["B1"] = "=SUM(1, 2, 3)"       # 数式もそのまま書き込める
wb.save("hello_edited.xlsx")

実務で役立つ3シナリオ

1. 請求書テンプレートへ自動入力

template = load_workbook("invoice_template.xlsx")
ws = template["請求書"]
ws["D4"] = "株式会社サンプル"
ws["D5"] = "2025/07/31"
for i, (name, qty, price) in enumerate(items, start=8):
    ws[f"A{i}"] = name
    ws[f"D{i}"] = qty
    ws[f"E{i}"] = price
template.save("invoice_202507.xlsx")

2. 複数CSVを1ブックに統合

import csv, glob
from openpyxl import Workbook
wb = Workbook()
for csv_path in glob.glob("*.csv"):
    ws = wb.create_sheet(title=csv_path[:-4])
    with open(csv_path, newline="") as f:
        for row in csv.reader(f):
            ws.append(row)
wb.remove(wb["Sheet"])           # 既定シートを削除
wb.save("merged.xlsx")

3. データからグラフ付きレポートを自動生成

from openpyxl.chart import BarChart, Reference
wb = load_workbook("sales_data.xlsx")
ws = wb.active

chart = BarChart()
chart.title = "月別売上"
data = Reference(ws, min_col=2, max_col=2, min_row=1, max_row=13)
cats = Reference(ws, min_col=1, max_col=1, min_row=2, max_row=13)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, "D2")

wb.save("sales_report.xlsx")

シート & セル操作まとめ

操作コード例
シート追加wb.create_sheet(title="2025年7月")
シート名変更ws.title = "メインシート"
シートコピーwb.copy_worksheet(ws)
シート削除del wb["不要シート"]
セル結合ws.merge_cells("A1:D1")
セル幅調整ws.column_dimensions["A"].width = 20

スタイルと書式設定

from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

ws["A1"].font = Font(bold=True, color="FFFFFF", size=14)
ws["A1"].fill = PatternFill("solid", fgColor="4F81BD")
ws["A1"].alignment = Alignment(horizontal="center", vertical="center")

thin = Side(border_style="thin", color="000000")
ws["A1"].border = Border(top=thin, left=thin, right=thin, bottom=thin)

読み書き高速化Tips

  • read_only=True でメモリを節約しつつストリーミング読取
  • write_only=True で大量行の書き込みを高速化
  • data_only=True で“数式結果” だけを取得(再計算はしない点に注意)

よくあるエラーと対処法 FAQ

AttributeError: 'NoneType' object has no attribute 'value'

セルが存在しない。if cell is not None: でチェック

日本語が????になる

.xls を読み込んでいる可能性。.xlsx に変換してから処理

セル結合後に値が取れない

結合セルの左上(例: A1)のみ値を保持している点に注意

XML関連のエラー

大容量ファイルで“billion laughs”攻撃対策が必要 → pip install defusedxml

まとめ:openpyxlで退屈なExcel作業を自動化しよう

  • インストールは1行、基本操作は5行
  • テンプレート活用で請求書やレポート作成を自動化
  • 書式・グラフ・画像も自在に操作できるため、VBA置き換えに最適
  • 次のステップとして Selenium自動実行 もチェック
\楽天ポイント5倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

当ブログの運営者であり全ての記事を書いた陰の者。
なんでも好きなものだけ書きます。
X(旧Twitter)でも更新情報とたまにくだらないことを発信中。
コメント解放しておりませんので、Xの方で感想いただけると嬉しくて更新が早くなる傾向にあります。調子乗りです。

目次