Pythonとopenpyxlを使ってExcelのファイル(Workbook)を開く方法はマスターしましたか?次なるステップは、シート内の具体的なデータを操作することです。その主役となるのがWorksheetオブジェクトです。
「特定のセルの値を読み書きしたい」「表データを一行ずつ処理したい」「Excelの最終行にデータを追加したい」
この記事では、そんなあなたのためのWorksheet操作を徹底的に解説します。セルの基本的なアクセス方法から、行・列を効率的に扱うテクニックまで、豊富なサンプルコードと共に学びましょう。
はじめに:Worksheetオブジェクトとは?
まずはWorksheetオブジェクトの役割をしっかり理解しましょう。
Excelシートを操作する主役
Worksheetオブジェクトは、Excelの個々のシート(例:「Sheet1」や「売上データ」など)そのものを表すオブジェクトです。 セルに値を書き込んだり、逆に行や列のデータを読み取ったりといった、データレベルの操作はすべてこのWorksheetオブジェクトを通じて行います。Workbookが「Excelファイル全体」なら、Worksheetは「中のページ1枚1枚」とイメージすると分かりやすいです。
基本のキ:Worksheetオブジェクトの取得方法
Worksheetを操作するには、まずWorkbookオブジェクトから目的のシートを取得する必要があります。取得方法は主に2つです。
from openpyxl import load_workbook
# 事前に作成したExcelファイルを読み込む
# このファイルには "Sheet1" と "データ一覧" というシートがあるとします
wb = load_workbook("test.xlsx") アクティブなシートを取得する (wb.active)
wb.activeは、Excelファイルを開いたときに最初に表示されるシート(アクティブシート)を取得します。 新規作成したファイルでは、最初のシートが自動的にアクティブになります。
# アクティブなシートを取得
ws = wb.active
print(f"アクティブシートのタイトル: {ws.title}")
# 出力例: アクティブシートのタイトル: Sheet1シート名を指定して取得する (wb['シート名'])
wb['シート名']のように、シート名を直接指定して特定のシートを取得できます。 こちらの方がより確実で、一般的に使われる方法です。
# "データ一覧"という名前のシートを取得
ws = wb['データ一覧']
print(f"取得したシートのタイトル: {ws.title}")
# 出力例: 取得したシートのタイトル: データ一覧Excel操作の核心!セルへのアクセスと値の読み書き
Worksheetオブジェクトを取得できたら、いよいよセルの操作です。セルへのアクセス方法も主に2通りあります。
A1表記法でアクセスする (ws['A1'])
最も直感的で簡単なのが、ExcelでおなじみのA1表記法です。 ws['B2']のように書くことで、B列の2行目にあるCellオブジェクトを取得できます。
# B2セルのオブジェクトを取得
cell_b2 = ws['B2']
print(f"B2セルの値: {cell_b2.value}") 行・列番号でアクセスする (ws.cell())
ループ処理などで動的にセルを指定したい場合は、ws.cell()メソッドが便利です。 row(行)とcolumn(列)を数値で指定します。数値は1から始まるので注意してください。
# 3行目・1列目(C1セル)のオブジェクトを取得
cell_c1 = ws.cell(row=3, column=1)
print(f"C1セルの値: {cell_c1.value}")セルの値を取得する (.value) と書き込む
セルの値を取得するには.valueプロパティを使います。セルに値を書き込むには、.valueに代入するか、ws['A1'] = '新しい値'のように直接代入します。
# A1セルの値を取得
a1_value = ws['A1'].value
print(f"読み込み前のA1の値: {a1_value}")
# A1セルに新しい値を書き込む
ws['A1'] = "Pythonからの書き込み"
print(f"書き込み後のA1の値: {ws['A1'].value}")
# B1セルに行・列番号で書き込む
ws.cell(row=1, column=2, value=123)
print(f"B1セルの値: {ws.cell(row=1, column=2).value}")
# 変更を保存
# wb.save("test_modified.xlsx")重要: 値を書き換えただけではファイルは変更されません。必ず最後にwb.save()で保存するのを忘れないようにしましょう。
複数のセルを効率的に操作する(行・列)
単一のセルだけでなく、複数のセルをまとめて扱う方法も見ていきましょう。
最終行に1行分のデータを追加する (append)
リストやタプルをws.append()メソッドに渡すことで、シートの最終行にデータを簡単に追加できます。 表形式のデータログを取る際などに非常に便利です。
# 追加したいデータ(リスト形式)
new_row_data = ["田中", "営業部", 45]
# シートの最終行にデータを追加
ws.append(new_row_data)
# wb.save("test_appended.xlsx")特定範囲のセルをまとめて取得する(スライシング)
ws['A1:C3']のように範囲を指定すると、その範囲のセルをまとめて取得できます。 これはタプルのタプル(行ごとのタプル)として返されます。
# A1からC2までの範囲のセルを取得
cell_range = ws['A1:C2']
for row_cells in cell_range:
for cell in row_cells:
print(cell.value, end=" | ")
print() # 改行ループですべての行・列を処理する (iter_rows, iter_cols)
シート全体のデータを1行ずつ、または1列ずつ処理したい場合はiter_rows()やiter_cols()が最適です。
# 1行ずつループ処理
print("--- 行ごとのデータ ---")
for row in ws.iter_rows(min_row=1, values_only=True):
print(row)
# values_only=Trueにすると、Cellオブジェクトではなく直接値が取得できるので便利です。知っていると超便利!Worksheetの便利プロパティ
最後に、シートの状態を知るための便利なプロパティを紹介します。
シートの最大行・最大列を取得 (max_row, max_column)
ws.max_rowとws.max_columnを使えば、データが入力されている最終行と最終列の番号を取得できます。 これにより、データ範囲を動的に指定したループ処理が可能になります。
data_rows = ws.max_row
data_cols = ws.max_column
print(f"このシートには {data_rows} 行、{data_cols} 列のデータがあります。")シートのタイトルを操作する (title)
ws.titleプロパティでシート名の取得や変更ができます。
# 現在のシート名を取得
current_title = ws.title
print(f"現在のシート名: {current_title}")
# シート名を変更
ws.title = "【更新】データ一覧"
print(f"変更後のシート名: {ws.title}")
# wb.save("test_renamed.xlsx")まとめ:Worksheet操作の要点をマスターしよう
openpyxlのWorksheetオブジェクトを使えば、Excelシート内のデータを自由自在に操作できます。今回の要点を振り返りましょう。
- シートの取得:
wb.activeかwb['シート名']でWorksheetオブジェクトを取得。 - セルへのアクセス:
ws['A1'](A1表記)またはws.cell(row=1, column=1)(行列番号)を使う。 - 値の操作:
.valueプロパティで読み書きする。 - 行の追加:
ws.append()でリストを渡せば簡単に行を追加できる。 - 範囲の操作: スライシング (
ws['A1:C5'])やiter_rows()で効率的にループ処理する。 - シート情報:
max_rowやtitleプロパティでシートの状態を取得・変更できる。
これらの基本操作を組み合わせることで、日々のExcel作業の多くをPythonで自動化できるようになります。ぜひ試してみてください。


コメント