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=True か write_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 が開かれている可能性があります。閉じて再実行してください。")