閉じる

【Python】openpyxlでExcel操作入門|読み込み・書き込み・編集のやり方

PythonでExcelを扱う場合、最初に覚えておきたいライブラリの1つがopenpyxlです。

GUIを開かずにPythonコードだけでブックの作成・読み込み・編集・保存まで行えるため、定型業務の自動化やデータ処理にとても役立ちます。

本記事では、インストールから基本的な読み書き、少し実践的な編集までを丁寧に解説します。

PythonでExcel操作を自動化するメリット

Excel操作をコード化する理由

業務でExcelを頻繁に扱うと、次のような場面が多くあります。

  • 毎日の集計結果をテンプレートに転記する
  • 大量のシートから一部の値だけを抜き出す
  • レポート用にフォーマットをそろえて保存する

これらを人手で行うと時間がかかるうえ、転記ミスも発生しやすくなります。

そこでExcel操作をPythonスクリプトで自動化することで、作業時間の短縮とミスの削減が期待できます。

openpyxlの特徴

PythonでExcelを扱うライブラリはいくつかありますが、openpyxlには次のような特徴があります。

  • .xlsx形式のExcelファイルを読み書きできる
  • セルの値だけでなく、罫線やフォント、色などの書式も扱える
  • 既存ファイルを開いて一部だけ編集して保存できる
  • インストールが簡単で、pipだけで導入できる

openpyxlの基本準備とインストール

インストール方法

まずはopenpyxlをインストールします。

ターミナル(コマンドプロンプト)で次のコマンドを実行します。

Shell
pip install openpyxl

仮想環境を使っている場合は、仮想環境を有効にしてからインストールしてください。

基本的な使い方の流れ

openpyxlでExcelを扱う処理の流れは、おおまかに次のようになります。

  1. 新規にブックを作成する、または既存ブックを読み込む
  2. シート(ワークシート)を取得する
  3. セルの値を書き込む、または読み取る
  4. 必要に応じて書式設定や計算を行う
  5. ファイルとして保存する

新規Excelファイルの作成と保存

もっとも基本的な「新規作成」

まずは、何もないところから新しいExcelファイルを作成して保存する例です。

Python
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関数を使用します。

Python
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種類あります。

  1. Excel風のアドレス指定(例: ws["B3"])
  2. 行番号・列番号で指定(例: ws.cell(row=3, column=2))

書き込み・更新の実例

Python
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セルずつ手書きするのではなく、リストや二次元リストを使ってループ処理を行うと効率的です。

Python
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メソッドが便利です。

Python
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では、フォント・色・罫線・塗りつぶしなどの基本的な書式を設定できます。

見出し行を太字・背景色付きにする

Python
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で簡単に操作できます。

Python
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_sheetremoveで追加・削除も柔軟に行えます。

既存Excelファイルの一部を編集して保存する流れ

読み込み→編集→上書き保存の例

日常的に多いのは、既存のテンプレートに対して、日付や数値だけ差し込んで保存するというパターンです。

Python
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数式を設定できます。

Python
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ファイルを題材に、読み書きと簡単な書式設定から試してみて、徐々にテンプレート運用や複数シートを使った本格的な自動化へ発展させていくとスムーズです。

業務自動化

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!