このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】セルの値の操作

セルの値の操作

 「セルの値の操作」とは、Excelファイルの個々のセルをプログラムで読み書きする方法を指します。Pythonのopenpyxlライブラリを使えば、既存のExcelファイルを開いてセルの内容を取得・変更したり、複数のセルを一度に処理したりすることが簡単に行えます。ここでは、ファイルを開く手順から複数セルの扱い方、行単位・列単位でのセル操作について解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.既存のExcelファイルを開く

 既存のExcelファイルを開くためには、openpyxlのload_workbook関数を使います。ファイルを開いたあとは、対象となるワークシートを指定することでセルの内容を自由に操作することが可能です。

1.1. load_workbook関数とは

 load_workbook関数は、指定された.xlsxファイルを読み込み、ワークブック(ブック)オブジェクトを返します。このオブジェクトに対してシートの取得やセルの操作を行います。

import openpyxl

# 既存ファイルを開く
workbook = openpyxl.load_workbook("items.xlsx")  
worksheet = workbook.active  # アクティブシートを取得

# A1とB1セルの値を表示(例)
print("A1:", worksheet["A1"].value)
print("B1:", worksheet["B1"].value)

items.xlsx

実行結果

A1: None
B1: None
  • import openpyxl
    ・openpyxlライブラリを読み込みます。
  • openpyxl.load_workbook("items.xlsx")
    ・引数に指定したファイル名("items.xlsx")を開きます。
    ・ファイルが存在しない場合はエラーとなります。
  • workbook.active
    ・読み込んだブックの中でアクティブなシート(通常は最初のシート)を取得します。

 上記のコードを実行すると、指定したExcelファイル内のセルA1とB1の値を取得して表示できます。読み込んだワークブックは、save()メソッドを使うことで同じファイル名に上書きすることも可能です。

1.2. ワークブックを編集する

 既存ファイルを編集するときは、セルの値を書き換えたあとにsave()メソッドを呼び出します。下記の例では、セルA1の内容を新しい文字列に変更したうえで保存しています。

worksheet["A1"] = "NewItem"
workbook.save("items.xlsx")

items.xlsx

  • worksheet["A1"] = "NewItem"
    ・セルA1に文字列"NewItem"を代入しています。
  • workbook.save("items.xlsx")
    ・変更内容を"items.xlsx"に上書き保存します。

 このように、既存ファイルを開いてセルを自由に編集することができるため、VBAを使わなくてもPythonだけで自動化処理を組み立てることができます。

2.複数のセルを読み書きする

 Excelファイルでは通常、1つだけではなく複数のセルを一度に処理することが多くあります。openpyxlでは、for文と組み合わせることで複数セルの読み書きを効率よく行えます。

2.1. for文でセルをまとめて書き込む

 たとえば、次のような商品リスト(名称と在庫数)をタプルのリストとして用意し、既存のシートにまとめて書き込んでみましょう。

import openpyxl

# 既存ファイルを開く
wb = openpyxl.load_workbook("items.xlsx")
ws = wb.active

# 商品リスト(名称, 在庫)
merchandise = [
    ("Apple", 120),
    ("Banana", 80),
    ("Grapes", 200)
]

# enumerateを用いて複数セルを書き込む
for index, (product, stock) in enumerate(merchandise, start=1):
    ws[f"A{index}"] = product
    ws[f"B{index}"] = stock

# 上書き保存
wb.save("items.xlsx")

items.xlsx

  • merchandise
    ・("Apple", 120)のように名前と在庫数をタプルにし、リスト化しています。
  • enumerate(merchandise, start=1)
    ・リストの先頭要素を1行目(A1・B1)に書き込むように調整しています。
  • ws[f"A{index}"] = product
    f-stringでセル位置を動的に生成し、商品名を記入します。
  • ws[f"B{index}"] = stock
    ・商品の在庫数を同じ行のB列に記入します。

複数行にわたるデータを自動的に割り当てられるため、商品数が増えても同じロジックで対応可能です。

2.2. iter_rowsメソッドを使った複数セルの読み取り

 Excel内の複数セルに記載されているデータを表示したい場合、iter_rows()メソッドを使うと便利です。1行分のセルをタプルで返してくれるため、値をまとめて取得できます。

import openpyxl

workbook = openpyxl.load_workbook("items.xlsx")
sheet_data = workbook.active

for row in sheet_data.iter_rows(values_only=True):
    # rowは1行分のセル値(タプル) 
    item_name, item_stock = row
    print(item_name, item_stock)

実行結果

Apple 120
Banana 80
Grapes 200
  • sheet_data.iter_rows(values_only=True)
    values_only=Trueを指定することで、セルオブジェクトではなくセルの値だけがタプルで返されます。
  • for row in ...:
    ・1行ごとに処理が行われ、rowには例として("Apple", 120)などのタプルが入ります。

 このように、iter_rowsメソッドは上から下に向かって行単位でデータを取得していきます。列単位で処理したい場合はiter_cols()メソッドも存在します。

下記の表に、iter_rows()メソッドの主な引数と意味をまとめます。

引数名意味
min_row最小の行番号(1から指定)
max_row最大の行番号(1から指定)
min_col最小の列番号(1から指定)
max_col最大の列番号(1から指定)
values_onlyTrueを指定するとセルの値のみ取得し、Falseならセルオブジェクトを返す

これらの引数を使えば、指定した範囲だけを効率よく読み取ることができます。

まとめ

 既存のExcelファイルを開いてセルを読み書きするにはload_workbook関数を使います。ワークブックオブジェクトからシートを取得し、セルの値を直接書き換えることで、簡単にExcelデータの更新が可能です。また、for文やiter_rows()メソッドを活用すれば、複数のセルをまとめて処理でき、行列単位のデータ操作もスムーズに行えます。これらの機能を組み合わせることで、ファイルの自動更新・集計・レポート作成など、さまざまなニーズに対応するスクリプトを作ることができるでしょう。