初心者向け openpyxl 入門|PythonでExcel操作を簡単に自動化する方法

初心者向け openpyxl 入門|PythonでExcel操作を簡単に自動化する方法

Excel を毎日扱う業務で、「同じ作業を何度も繰り返すのが面倒」「手作業だとミスが多い」と感じたことはありませんか?
特にデータ集計やレポート作成は、時間も手間もかかりますよね。
そんな悩みを解決するのが Python の openpyxl です。
本記事では、openpyxl を使った Excel 操作の基本から応用まで、コード例付きでわかりやすく解説します。
この記事を読めば、Excel の作業を自動化できるだけでなく、業務効率化やミス削減にもつなげられます。
初心者でもすぐに実務で使える内容になっていますので、今日から Python × Excel の自動化に挑戦できます。

目次

なぜ今「openpyxl」で Excel を操作するのか

Excel × Python 自動化のメリット

Excel 作業って、毎回同じことの繰り返しになりがちですよね。
ぼくも昔は、手作業でコピペしてはミスをして…みたいなことをずっとやっていました。
でも Python と openpyxl を使うと、こういった“単純作業”をほぼ自動化できます。
人がやると10分かかる作業も、スクリプトなら一瞬。
再現性も高く、業務の品質も安定します。
Excel マクロ(VBA)が苦手な人でも Python なら読みやすいので、チーム開発にも向いています。

openpyxl とは? — ライブラリの概要と特徴

openpyxl は「Python で Excel(.xlsx)を扱うための定番ライブラリ」です。
Excel の読み込み・書き込み・書式設定・数式など、ほぼ一通りの操作ができます。
Python だけでレポート生成やデータ加工が完結するので、業務効率化には欠かせない存在。
しかも、追加インストールは pip 一発でOK。
pandas が内部で使っていることもあり、実務での信頼性もバッチリです。

import openpyxl

wb = openpyxl.load_workbook("sample.xlsx")
ws = wb.active
print(ws["A1"].value)

openpyxl が向いているケース/逆に注意すべき場面

openpyxl が向いているのは「Excel をきれいに整えて出力したい場面」です。
例えばレポート作成、フォーマット調整、請求書生成など。
一方で、大量のデータ処理はあまり得意ではありません。
行数が多すぎるとメモリを食うため、重くなりがち。
そういうときは pandas をメインに使い、最終出力だけ openpyxl を使うのが鉄板です。

# 大量データ → pandas → 最後だけ openpyxl で書式調整
import pandas as pd

df = pd.read_csv("data.csv")
df.to_excel("output.xlsx", index=False)  # まず出力

【準備編】 openpyxl のインストールと初期設定

インストール方法(pip、Python 環境)

openpyxl は Python が入っていれば、pip で一発インストールできます。
特に難しい設定はなく、開発初心者でもつまずきにくいライブラリです。
もし Python をまだ入れていないなら、まずは公式から最新版(3.x)を入れておきましょう。
仮想環境(venv)を使うと環境が汚れないので、実務ではほぼ必須。
インストールは以下の通りで完了します。

pip install openpyxl

openpyxl のインポートと基本構成 — Workbook/Worksheet/Cell の関係

openpyxl の基本構造はシンプルで、「Workbook(ファイル) → Worksheet(シート) → Cell(セル)」という階層になっています。
まずは Workbook を作り、その中に複数の Worksheet があり、各シートの中に Cell が並ぶイメージ。
Python のコードが直感的なので覚えやすいです。
以下のコードで構造をざっくりつかめます。

from openpyxl import Workbook

wb = Workbook()           # Excel ファイル
ws = wb.active            # シート取得
ws["A1"] = "Hello"        # セルに書き込み
wb.save("sample.xlsx")

動作環境のチェックポイント(Python バージョン、.xlsx対応など)

openpyxl は .xlsx 形式専用 なので、古い .xls ファイルには対応していません(xlsx へ変換すればOK)。
Python は 3.8 以上を推奨。Excel がインストールされていなくても動くので、サーバーサイドの処理としても安心して使えます。
また、Excel を開いたままだと保存エラーになることがあるので、ファイル操作前は閉じておくのが基本。
実務では案外ここでハマりがちです。

import openpyxl

wb = openpyxl.load_workbook("sample.xlsx")  # xlsx のみ対応
print(wb.sheetnames)

基本操作 — Excel ファイルの作成・読み込み・保存

新規ワークブックの作成と保存方法(Workbook → シート → 保存)

openpyxl で Excel ファイルを新規作成する流れはとてもシンプルです。Workbook を作り、必要があればシートを追加し、最後に save() で保存するだけ。
とりあえず A1 に文字を入れて保存するだけでも “動いた感” が味わえるので、まずはこの最小コードを動かすのがおすすめ。
Excel を直接開かなくても Python だけで作業が完結するのは、とても快適です。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws["A1"] = "はじめての openpyxl"
wb.save("create_example.xlsx")

既存の Excel ファイルを開く(load_workbook)

すでにある Excel ファイルを操作したい場合は、load_workbook() を使います。
読み込んだ瞬間に Workbook オブジェクトとして扱えるので、あとは普通にセルを書き換えたり、シートを取得したりできます。
読み取り専用モード(read_only=True)もあるので、大きなファイルを扱う時にも便利です。

import openpyxl

wb = openpyxl.load_workbook("create_example.xlsx")
ws = wb.active
print(ws["A1"].value)

シートの取得/シート名の指定方法

Workbook には複数のシートが入っているので、名前を指定して取得したい場面は多いです。
たとえば “Report” シートだけ操作したい、みたいなケースですね。
wb.sheetnames で一覧を確認でき、wb["シート名"] で直接アクセスできます。
存在チェックを入れておくと実務で安全です。

import openpyxl

wb = openpyxl.load_workbook("create_example.xlsx")
print(wb.sheetnames)

ws = wb[wb.sheetnames[0]]   # 最初のシート
# ws = wb["Sheet1"]         # 名前指定でもOK

セルへの読み書き — データの読み込みと書き込み

セル指定方法:A1 表記、行・列指定、ユーティリティ関数など

openpyxl はセルの指定方法が柔軟で、「A1 表記」も「行・列指定」もどちらも使えます。
個人的には A1 記法が一番わかりやすいですが、ループ処理をするなら行番号・列番号で指定する方法が便利です。
また、cell(row=, column=) を使えば動的にセルを扱えるので、レポート生成のような場面で重宝します。

import openpyxl

wb = openpyxl.load_workbook("create_example.xlsx")
ws = wb.active

ws["B1"] = "A1 の右のセル"
ws.cell(row=2, column=1, value="2行1列のセル")

wb.save("cell_example.xlsx")

セルに値を書き込む/読み取る基本コード例

値の書き込みと読み取りは本当にシンプルです。
代入すれば書き込み、.value を読めば取り出せます。
Excel のセル操作はむずかしそうに見えがちですが、openpyxl なら変数を扱うような感覚でサクッと触れるので、Python 初心者でもスムーズに使えると思います。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

ws["A1"] = 123
ws["B1"] = "文字列"
ws["C1"] = 3.14

print(ws["A1"].value)
print(ws["B1"].value)

wb.save("write_read.xlsx")

行・列単位での操作:ループ処理や iter_rows / iter_cols の使い方

行単位・列単位で処理したい場合は、iter_rows()iter_cols() が便利です。
これらはセルの塊をまとめて取り出せるので、大量データの読み込みにも強いです。
特に表形式のデータを解析したいときは、ほぼ必須のメソッド。値を順番に処理するだけなら扱いも簡単です。

import openpyxl

wb = openpyxl.load_workbook("write_read.xlsx")
ws = wb.active

for row in ws.iter_rows(min_row=1, max_row=1):
    for cell in row:
        print(cell.value)

応用操作 — 書式設定・スタイル・数式・シート操作など

フォント・罫線・背景色・列幅/行高の変更方法

openpyxl を使うと、Excel らしい“見た目の整った表”を作れます。
レポートや請求書の自動生成では、書式設定がほぼ必須です。フォント・色・罫線・列幅などは openpyxl.styles を使えば簡単に設定できます。
人間に見せる資料を Python で作りたいときにめちゃくちゃ役立ちます。

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

wb = Workbook()
ws = wb.active

ws["A1"] = "タイトル"
ws["A1"].font = Font(size=14, bold=True)
ws["A1"].fill = PatternFill("solid", fgColor="FFFF99")
ws.column_dimensions["A"].width = 20

border = Border(bottom=Side(style='thin'))
ws["A1"].border = border

wb.save("style_example.xlsx")

数式の書き込み、自動計算セルの扱い

Excel らしく“計算させたい”なら、普通に数式を書き込むだけでOKです。
ただし openpyxl は 計算結果を更新しない ので、実際の計算は Excel を開いたときに実行されます。
つまり “計算結果を Python 内で取得したい” 場面では注意が必要。レポート生成ではよく使います。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

ws["A1"] = 10
ws["A2"] = 20
ws["A3"] = "=SUM(A1:A2)"   # 数式を書くだけでOK

wb.save("formula_example.xlsx")

シートの追加・削除、シート名の変更、シート切り替えなど

複数シートを扱う場面は多いです。
openpyxl ではシートの追加・削除・名前変更が直感的に書けます。
月次レポートのテンプレートを自動生成したり、データ量に応じてシートを分けたりするときに便利。
特に wb.copy_worksheet() は “テンプレート複製 → 名前変更 → 書き込み” という流れでよく使います。

import openpyxl

wb = openpyxl.Workbook()
ws1 = wb.active
ws1.title = "Summary"

ws2 = wb.create_sheet("Data")
wb.remove(ws1)  # 削除も可能

ws3 = wb.create_sheet()
ws3.title = "Report_2025"

wb.save("sheet_example.xlsx")

実務的な使い方 — サンプルで見る Excel 自動化のシナリオ

複数 Excel ファイルを読み込んで 1 つに集計する例(フォルダ内のファイルまとめ)

実務で一番使われるのが“複数ファイルの自動集計”です。
毎月の売上ファイルや、部署ごとの報告書などを 1 つのブックにまとめたい…というケース、めちゃくちゃ多いですよね。
Python と openpyxl を使えば、フォルダ内の Excel をループで読み込み、必要なセルだけ抽出して1枚の Excel にまとめる処理が簡単にできます。

import openpyxl
import glob

result = openpyxl.Workbook()
ws_out = result.active
ws_out.append(["ファイル名", "A1 値"])

for file in glob.glob("data/*.xlsx"):
    wb = openpyxl.load_workbook(file)
    ws = wb.active
    ws_out.append([file, ws["A1"].value])

result.save("merge_result.xlsx")

Excel データ → Python データ構造(リスト/辞書など)への変換

Excel のデータを Python 側に取り込んで加工したいことも多いです。
例えば顧客リストや売上データをリストや辞書に変換して、分析処理につなげる流れ。
openpyxl はループでセルを読み込むだけなので扱いやすく、初心者でもサクッとデータ変換ができます。
pandas ほど重くならない点も便利です。

import openpyxl

wb = openpyxl.load_workbook("write_read.xlsx")
ws = wb.active

data = []
for row in ws.iter_rows(values_only=True):
    data.append(list(row))

print(data)

Excel へのレポート出力やフォーマット付き出力、自動で定期レポート生成

“毎月同じフォーマットのレポートを作る” みたいな業務は自動化と相性がバツグンです。
テンプレート Excel を 1 枚作っておき、そこに必要な数値を書き込んで保存するだけで OK。
フォーマットはテンプレートに任せるので、Python 側のコードは非常にシンプルになります。
cron(スケジューラー)と組み合わせれば完全自動化も可能。

import openpyxl

wb = openpyxl.load_workbook("template.xlsx")
ws = wb.active

ws["B2"] = 15000  # 今月の売上
ws["B3"] = 320    # 新規顧客数

wb.save("report_2025_01.xlsx")

openpyxl を使う上での注意点とベストプラクティス

ファイルの上書き保存時の注意(Excel を開いたままの警告など)

openpyxl でよくあるトラブルが「Excel を開いたまま保存しようとして失敗する」問題です。
Excel 側がファイルをロックするため、Python から上書きできなくなります。
実務で自動化するなら、処理対象の Excel は必ず閉じておく が鉄則です。
また、保存時にファイル名を時刻付きで別名保存にしておくと、上書き事故を防げて安心です。

import openpyxl
import time

wb = openpyxl.load_workbook("report.xlsx")
# 処理…
wb.save(f"report_{int(time.time())}.xlsx")  # 上書き事故防止

大規模データ操作時のパフォーマンスと read_only, write_only の使い分け

openpyxl は便利ですが、大量行の処理は苦手です。
10万行を超えるようなデータを扱う場合は、read_only=Truewrite_only=True を使うのがベスト。
メモリ使用量が一気に軽くなり、処理速度も改善します。
それでも重いと感じたら、pandas を併用して“加工:pandas → 出力:openpyxl” の流れにするのが実務での定番パターンです。

import openpyxl

wb = openpyxl.load_workbook("big.xlsx", read_only=True)
ws = wb.active

for row in ws.iter_rows(values_only=True):
    pass  # 軽量に処理できる

別ライブラリ(たとえば pandas)との使い分けの検討

openpyxl は Excel の“見た目操作”に強いですが、“データ加工”は pandas の方が圧倒的に速くて便利です。
なので実務では、データ整形は pandas、書式付き出力は openpyxl という組み合わせが最強。
pandas の to_excel() で土台を作り、最後に openpyxl で書式を整えるだけで、きれいなレポートが高速で作れます。

import pandas as pd

df = pd.read_csv("data.csv")
df.to_excel("output.xlsx", index=False)  # pandasで出力 → あとでopenpyxlで装飾

まとめ — まず覚えるべき最低限のコードと今後の学び方

openpyxl は「Python で Excel を触りたい」と思ったときの最初の一歩として最適です。
まずは 新規作成 → 読み込み → セル操作 → 保存 の基本4ステップだけ覚えれば、簡単な自動化はすぐできるようになります。
慣れてきたら、テンプレート運用・複数ファイルの集計・書式設定あたりを学ぶと一気に実務レベルへ。
pandas との併用も視野に入れると、業務の自動化の幅が大きく広がります。

from openpyxl import Workbook, load_workbook

# 新規作成
wb = Workbook()
ws = wb.active
ws["A1"] = "Hello"
wb.save("basic.xlsx")

# 読み込み
wb2 = load_workbook("basic.xlsx")
print(wb2.active["A1"].value)

(付録)よくあるエラーとその対処方法

実際に使っていると、openpyxl ではよくある“ハマりポイント”がいくつかあります。
とくに多いのは、ファイルを開いたままで保存できないエラー。これは Excel がファイルをロックしているのが原因なので、閉じて再実行すればOK。
他には、.xls は読めない(xlsx に変換が必要)、数式の計算結果が Python 側で更新されない(Excel で再計算される)という点も覚えておくとラクになります。
以下のように例外処理を入れると実務で安全です。

import openpyxl

try:
    wb = openpyxl.load_workbook("locked.xlsx")
    wb.save("locked.xlsx")
except PermissionError:
    print("Excel が開かれている可能性があります。閉じて再実行してください。")

pythonカテゴリの最新記事