PythonでExcelを扱う場合、最初に覚えておきたいライブラリの1つがopenpyxlです。
GUIを開かずにPythonコードだけでブックの作成・読み込み・編集・保存まで行えるため、定型業務の自動化やデータ処理にとても役立ちます。
本記事では、インストールから基本的な読み書き、少し実践的な編集までを丁寧に解説します。
PythonでExcel操作を自動化するメリット
Excel操作をコード化する理由
業務でExcelを頻繁に扱うと、次のような場面が多くあります。
- 毎日の集計結果をテンプレートに転記する
- 大量のシートから一部の値だけを抜き出す
- レポート用にフォーマットをそろえて保存する
これらを人手で行うと時間がかかるうえ、転記ミスも発生しやすくなります。
そこでExcel操作をPythonスクリプトで自動化することで、作業時間の短縮とミスの削減が期待できます。
openpyxlの特徴
PythonでExcelを扱うライブラリはいくつかありますが、openpyxlには次のような特徴があります。
- .xlsx形式のExcelファイルを読み書きできる
- セルの値だけでなく、罫線やフォント、色などの書式も扱える
- 既存ファイルを開いて一部だけ編集して保存できる
- インストールが簡単で、
pipだけで導入できる
openpyxlの基本準備とインストール
インストール方法
まずはopenpyxlをインストールします。
ターミナル(コマンドプロンプト)で次のコマンドを実行します。
pip install openpyxl
仮想環境を使っている場合は、仮想環境を有効にしてからインストールしてください。
基本的な使い方の流れ
openpyxlでExcelを扱う処理の流れは、おおまかに次のようになります。
- 新規にブックを作成する、または既存ブックを読み込む
- シート(ワークシート)を取得する
- セルの値を書き込む、または読み取る
- 必要に応じて書式設定や計算を行う
- ファイルとして保存する
新規Excelファイルの作成と保存
もっとも基本的な「新規作成」
まずは、何もないところから新しいExcelファイルを作成して保存する例です。

from openpyxl import Workbook
# Workbookクラスで新規ブックを作成
wb = Workbook()
# アクティブなシート(最初のシート)を取得
ws = wb.active
# A1セルに文字列を書き込む
ws["A1"] = "Hello, Excel!"
# Excelファイルとして保存
wb.save("sample_new.xlsx")
上記のコードを実行すると、カレントディレクトリにsample_new.xlsxというファイルが生成され、A1セルに「Hello, Excel!」と入力された状態になります。
既存Excelファイルの読み込みと値の取得
既存ブックを開く
すでに存在するExcelファイルから値を読み取りたい場合は、load_workbook関数を使用します。

from openpyxl import load_workbook
# 既存のExcelファイルを読み込む
wb = load_workbook("sample_existing.xlsx")
# シート名を指定してシートを取得
ws = wb["Sheet1"]
# A1セルの値を取得
value_a1 = ws["A1"].value
print("A1セルの値:", value_a1)
A1セルの値: 100
上記のように、ws["A1"].valueとすることで、セルに格納された値をPython側で扱うことができます。
セルへの書き込みと更新の基本
セル参照の2つの方法
openpyxlでセルを指定する方法は、大きく分けて2種類あります。
- Excel風のアドレス指定(例:
ws["B3"]) - 行番号・列番号で指定(例:
ws.cell(row=3, column=2))
書き込み・更新の実例

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 1. Excel風のアドレス指定で書き込み
ws["A1"] = "商品名"
ws["B1"] = "単価"
ws["C1"] = "数量"
# 2. 行番号・列番号で書き込み
ws.cell(row=2, column=1, value="りんご")
ws.cell(row=2, column=2, value=120)
ws.cell(row=2, column=3, value=3)
# 既存セルの更新も同じ書き方でOK
ws["B2"] = 130 # B2セルの単価を更新
wb.save("sample_write.xlsx")
上記のようにセルへの書き込みと更新は同じ文法で行えるため、値を上書きしたいときも特別なメソッドは不要です。
行・列のループ処理と表形式データの扱い
複数行をまとめて書き込む
表形式のデータを扱う場合、1セルずつ手書きするのではなく、リストや二次元リストを使ってループ処理を行うと効率的です。

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 書き込みたいデータを二次元リストで用意
data = [
["商品名", "単価", "数量"],
["りんご", 120, 3],
["みかん", 80, 5],
["バナナ", 100, 2],
]
# 1行ずつループで書き込む
for row_idx, row_data in enumerate(data, start=1):
for col_idx, value in enumerate(row_data, start=1):
ws.cell(row=row_idx, column=col_idx, value=value)
wb.save("sample_table.xlsx")
行番号・列番号をループで扱うことで、行数や列数が増えても柔軟に対応できます。
既存の表を行ごとに読み込む
既存のExcelに表形式のデータが入っている場合は、iter_rowsメソッドが便利です。
from openpyxl import load_workbook
wb = load_workbook("sample_table.xlsx")
ws = wb.active
# ヘッダー行を含めて全行を走査
for row in ws.iter_rows(min_row=1, values_only=True):
# rowはタプル(例: ("りんご", 120, 3))になる
print(row)
('商品名', '単価', '数量')
('りんご', 120, 3)
('みかん', 80, 5)
('バナナ', 100, 2)
values_only=Trueを指定すると、セルオブジェクトではなく値だけが取得できるため、データ処理に向いています。
セルの書式設定(フォント・色・罫線)
Excelらしい表を作るには、値だけでなく書式も重要です。
openpyxlでは、フォント・色・罫線・塗りつぶしなどの基本的な書式を設定できます。
見出し行を太字・背景色付きにする

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side
wb = Workbook()
ws = wb.active
# データ本体
data = [
["商品名", "単価", "数量"],
["りんご", 120, 3],
["みかん", 80, 5],
["バナナ", 100, 2],
]
for row_idx, row_data in enumerate(data, start=1):
for col_idx, value in enumerate(row_data, start=1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
# 1行目(ヘッダー)だけ書式を変更
if row_idx == 1:
# 太字フォント
cell.font = Font(bold=True, color="FFFFFF")
# 背景色(青系)
cell.fill = PatternFill(
fill_type="solid",
fgColor="4F81BD"
)
# 罫線スタイルを定義して全セルに適用
thin = Side(border_style="thin", color="000000")
border = Border(top=thin, left=thin, right=thin, bottom=thin)
for row in ws.iter_rows():
for cell in row:
cell.border = border
wb.save("sample_style.xlsx")
このように、stylesモジュールの各クラス(Font, PatternFill, Borderなど)をセルに割り当てることで、見やすい表を作成できます。
シートの追加・削除・名前変更
シートを追加して管理する
複数シートを持つブックを扱いたい場合も、openpyxlで簡単に操作できます。

from openpyxl import Workbook
wb = Workbook()
# 既定で1つシートがある
ws1 = wb.active
ws1.title = "データ" # シート名を変更
# 新しいシートを追加
ws2 = wb.create_sheet(title="集計")
# 先頭にシートを追加したい場合は、index指定も可能
ws3 = wb.create_sheet(title="設定", index=0)
# 不要なシートを削除
wb.remove(ws2)
wb.save("sample_sheets.xlsx")
titleプロパティでシート名を変更でき、create_sheetやremoveで追加・削除も柔軟に行えます。
既存Excelファイルの一部を編集して保存する流れ
読み込み→編集→上書き保存の例
日常的に多いのは、既存のテンプレートに対して、日付や数値だけ差し込んで保存するというパターンです。

from openpyxl import load_workbook
from datetime import date
# テンプレートを読み込む
wb = load_workbook("report_template.xlsx")
ws = wb["レポート"]
# 日付や数値を差し込む
today = date.today()
ws["B2"] = today # 日付セル
ws["B3"] = 300000 # 売上合計
ws["B4"] = 150 # 注文件数
# 別名で保存(元のテンプレートを残したい場合)
wb.save("report_output.xlsx")
テンプレートを頻繁に使う場合は、元ファイルは編集せず別名で保存する運用にしておくと安全です。
数式の入力と再計算の注意点
セルにExcelの数式を入れる
openpyxlでは、"=SUM(A1:A10)"のような文字列をそのまま書き込むことで、Excel数式を設定できます。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws["A1"] = 10
ws["A2"] = 20
ws["A3"] = 30
# 合計を計算する数式をB1セルに設定
ws["B1"] = "=SUM(A1:A3)"
wb.save("sample_formula.xlsx")
ここで重要なのは、openpyxl自身は数式を計算しないという点です。
数式の結果は、Excelを開いたときにExcel側が再計算して表示します。
数式の結果をPython側で使いたい場合
Excelを開かずに結果をPythonで使いたい場合は、openpyxlではなくpandasやPython標準の計算機能で集計する、という設計にする方が現実的です。
openpyxlは「数式を埋め込むためのツール」と割り切ると理解しやすくなります。
まとめ
openpyxlを使うことで、PythonからExcelファイルの新規作成・読み込み・編集・保存まで一通り操作できるようになります。
セルの指定方法や、行・列のループ処理、書式設定、シートの追加・削除といった基本を押さえておけば、日々のレポート作成や集計作業の自動化が実現しやすくなります。
まずは小さなExcelファイルを題材に、読み書きと簡単な書式設定から試してみて、徐々にテンプレート運用や複数シートを使った本格的な自動化へ発展させていくとスムーズです。
