【Python openpyxl】Worksheet完全ガイド!セルの読み書きから行・列操作まで

openpyxl

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_rowws.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操作の要点をマスターしよう

openpyxlWorksheetオブジェクトを使えば、Excelシート内のデータを自由自在に操作できます。今回の要点を振り返りましょう。

  • シートの取得: wb.activewb['シート名']Worksheetオブジェクトを取得。
  • セルへのアクセス: ws['A1'](A1表記)またはws.cell(row=1, column=1)(行列番号)を使う。
  • 値の操作: .valueプロパティで読み書きする。
  • 行の追加: ws.append()でリストを渡せば簡単に行を追加できる。
  • 範囲の操作: スライシング (ws['A1:C5'])やiter_rows()で効率的にループ処理する。
  • シート情報: max_rowtitleプロパティでシートの状態を取得・変更できる。

これらの基本操作を組み合わせることで、日々のExcel作業の多くをPythonで自動化できるようになります。ぜひ試してみてください。

コメント

タイトルとURLをコピーしました