[Python] エクセルで最終行を取得する方法【openpyxl】

Pythonのライブラリ openpyxl を使用してエクセルファイルの最終行を取得するには、worksheet.max_rowを使用します。

openpyxlはエクセルファイルを操作するためのライブラリで、max_rowはシート内のデータが入力されている最終行の番号を返します。

例えば、ws.max_rowとすることで、wsというワークシートオブジェクトの最終行を取得できます。

空白行が含まれている場合でも、データがある最後の行を取得します。

この記事でわかること
  • openpyxlを使ったエクセル操作
  • 最終行や最終列の取得方法
  • セルの値の取得と入力方法
  • データの範囲指定とループ処理
  • エクセルファイルの保存方法

目次から探す

openpyxlとは

openpyxlは、PythonでExcelファイル(.xlsx形式)を操作するためのライブラリです。

このライブラリを使用することで、Excelファイルの読み込み、書き込み、編集が簡単に行えます。

特に、データ分析や自動化のタスクにおいて、Excelファイルを扱うことが多い場合に非常に便利です。

openpyxlは、セルの値の取得や設定、シートの追加や削除、書式設定など、さまざまな機能を提供しており、Pythonプログラミングを通じてExcelを効果的に活用することができます。

エクセルファイルの読み込み

エクセルファイルを開く方法

openpyxlを使用してエクセルファイルを開くには、まずライブラリをインポートし、load_workbook関数を使います。

以下のサンプルコードでは、指定したファイル名のエクセルファイルを開く方法を示しています。

from openpyxl import load_workbook
# エクセルファイルを開く
workbook = load_workbook('sample.xlsx')

このコードを実行すると、sample.xlsxという名前のエクセルファイルが開かれ、workbookという変数にワークブックオブジェクトが格納されます。

ワークブックとワークシートの取得

エクセルファイルを開いた後、ワークブックから特定のワークシートを取得することができます。

以下のサンプルコードでは、ワークブックからデフォルトのシートを取得する方法を示しています。

# デフォルトのワークシートを取得
worksheet = workbook.active

また、特定のシート名を指定して取得することも可能です。

# シート名を指定して取得
worksheet = workbook['Sheet1']

シート名の指定方法

シート名を指定する際は、シート名を文字列として指定します。

シート名は大文字小文字を区別するため、正確に入力する必要があります。

以下のサンプルコードでは、シート名を指定してワークシートを取得する方法を示しています。

# シート名を指定して取得
worksheet = workbook['データ']

シートの一覧を取得する方法

ワークブック内のすべてのシート名を取得するには、sheetnamesプロパティを使用します。

以下のサンプルコードでは、ワークブック内のシート名をリストとして取得し、表示する方法を示しています。

# シート名の一覧を取得
sheet_names = workbook.sheetnames
# シート名を表示
print(sheet_names)

このコードを実行すると、ワークブック内のすべてのシート名がリスト形式で表示されます。

エクセルの最終行を取得する方法

max_rowプロパティの使い方

openpyxlでは、ワークシートの最終行を取得するためにmax_rowプロパティを使用します。

このプロパティは、シート内のデータが入力されている最も下の行番号を返します。

以下のサンプルコードでは、max_rowを使って最終行を取得する方法を示しています。

from openpyxl import load_workbook
# エクセルファイルを開く
workbook = load_workbook('sample.xlsx')
worksheet = workbook.active
# 最終行を取得
last_row = worksheet.max_row
print(f'最終行: {last_row}')

このコードを実行すると、シート内の最終行番号が表示されます。

最終行の取得例

具体的な例として、以下のようなデータがあるとします。

スクロールできます
A列B列
12
34
5

この場合、max_rowを使用すると、最終行は3と表示されます。

# 最終行を取得
last_row = worksheet.max_row
print(f'最終行: {last_row}')  # 出力: 最終行: 3

空白行がある場合の注意点

max_rowは、シート内の最終行を取得する際に、空白行がある場合でもその行を含めてカウントします。

したがって、データが途中で途切れている場合、実際のデータの最終行とは異なる結果が返されることがあります。

例えば、以下のようなデータがある場合、

スクロールできます
A列B列
12
34

この場合、max_rowは3を返しますが、実際のデータは1行目と3行目のみです。

データが途中で途切れている場合の対処法

データが途中で途切れている場合、max_rowだけでは正確な最終行を取得できないことがあります。

このような場合は、ループを使用して、実際にデータが入力されている行を確認する方法が有効です。

以下のサンプルコードでは、各行をチェックして、最終行を特定する方法を示しています。

# 実際の最終行を取得するための変数
actual_last_row = 0
# 各行をチェック
for row in worksheet.iter_rows(min_row=1, max_col=1, max_row=worksheet.max_row):
    if row[0].value is not None:  # セルが空でない場合
        actual_last_row = row[0].row
print(f'実際の最終行: {actual_last_row}')

このコードを実行すると、実際にデータが入力されている最終行が表示されます。

最終行を使った応用例

最終行にデータを追加する方法

最終行を取得した後、その行の次の行に新しいデータを追加することができます。

以下のサンプルコードでは、最終行の次の行にデータを追加する方法を示しています。

from openpyxl import load_workbook
# エクセルファイルを開く
workbook = load_workbook('sample.xlsx')
worksheet = workbook.active
# 最終行を取得
last_row = worksheet.max_row
# 最終行の次の行にデータを追加
worksheet.cell(row=last_row + 1, column=1, value='新しいデータ')
worksheet.cell(row=last_row + 1, column=2, value=100)
# エクセルファイルを保存
workbook.save('sample.xlsx')

このコードを実行すると、最終行の次の行に「新しいデータ」と100が追加されます。

最終行までのデータをループ処理する方法

最終行を使って、データをループ処理することも可能です。

以下のサンプルコードでは、最終行までのデータを取得し、各セルの値を表示する方法を示しています。

# 最終行を取得
last_row = worksheet.max_row
# 最終行までのデータをループ処理
for row in range(1, last_row + 1):
    cell_value = worksheet.cell(row=row, column=1).value
    print(f'行 {row}: {cell_value}')

このコードを実行すると、1列目の各行の値が表示されます。

最終行を基準に範囲を指定してデータを取得する方法

最終行を基準にして、特定の範囲のデータを取得することもできます。

以下のサンプルコードでは、最終行のデータを含む範囲を指定して、データを取得する方法を示しています。

# 最終行を取得
last_row = worksheet.max_row
# 最終行までのデータを取得
data_range = worksheet.iter_rows(min_row=1, max_row=last_row, min_col=1, max_col=2)
# データを表示
for row in data_range:
    for cell in row:
        print(cell.value, end=' ')
    print()  # 改行

このコードを実行すると、指定した範囲のデータが表示されます。

最終行を削除する方法

最終行を削除するには、delete_rowsメソッドを使用します。

以下のサンプルコードでは、最終行を削除する方法を示しています。

# 最終行を取得
last_row = worksheet.max_row
# 最終行を削除
worksheet.delete_rows(last_row)
# エクセルファイルを保存
workbook.save('sample.xlsx')

このコードを実行すると、最終行が削除され、エクセルファイルが更新されます。

エクセルの最終列を取得する方法

max_columnプロパティの使い方

openpyxlでは、ワークシートの最終列を取得するためにmax_columnプロパティを使用します。

このプロパティは、シート内のデータが入力されている最も右の列番号を返します。

以下のサンプルコードでは、max_columnを使って最終列を取得する方法を示しています。

from openpyxl import load_workbook
# エクセルファイルを開く
workbook = load_workbook('sample.xlsx')
worksheet = workbook.active
# 最終列を取得
last_column = worksheet.max_column
print(f'最終列: {last_column}')

このコードを実行すると、シート内の最終列番号が表示されます。

最終列の取得例

具体的な例として、以下のようなデータがあるとします。

スクロールできます
A列B列C列
123
45
7

この場合、max_columnを使用すると、最終列は3と表示されます。

# 最終列を取得
last_column = worksheet.max_column
print(f'最終列: {last_column}')  # 出力: 最終列: 3

最終行と最終列を組み合わせた範囲指定

最終行と最終列を組み合わせることで、特定の範囲のデータを取得することができます。

以下のサンプルコードでは、最終行と最終列を使って、データの範囲を指定し、すべてのデータを表示する方法を示しています。

# 最終行と最終列を取得
last_row = worksheet.max_row
last_column = worksheet.max_column
# データの範囲を取得
data_range = worksheet.iter_rows(min_row=1, max_row=last_row, min_col=1, max_col=last_column)
# データを表示
for row in data_range:
    for cell in row:
        print(cell.value, end=' ')
    print()  # 改行

このコードを実行すると、指定した範囲のデータが表示されます。

これにより、シート内のすべてのデータを効率的に取得することができます。

エクセルのデータを操作する方法

セルの値を取得する方法

openpyxlを使用して、特定のセルの値を取得するには、cellメソッドを使用します。

以下のサンプルコードでは、A1セルの値を取得する方法を示しています。

from openpyxl import load_workbook
# エクセルファイルを開く
workbook = load_workbook('sample.xlsx')
worksheet = workbook.active
# A1セルの値を取得
cell_value = worksheet.cell(row=1, column=1).value
print(f'A1セルの値: {cell_value}')

このコードを実行すると、A1セルの値が表示されます。

セルに値を入力する方法

特定のセルに値を入力するには、cellメソッドを使用して値を設定します。

以下のサンプルコードでは、B2セルに新しい値を入力する方法を示しています。

# B2セルに値を入力
worksheet.cell(row=2, column=2, value='新しい値')
# エクセルファイルを保存
workbook.save('sample.xlsx')

このコードを実行すると、B2セルに「新しい値」が入力され、エクセルファイルが更新されます。

セルの書式を変更する方法

セルの書式を変更するには、openpyxl.stylesモジュールを使用します。

以下のサンプルコードでは、A1セルのフォントを太字に変更する方法を示しています。

from openpyxl import load_workbook
from openpyxl.styles import Font
# エクセルファイルを開く
workbook = load_workbook('sample.xlsx')
worksheet = workbook.active
# A1セルのフォントを太字に変更
worksheet['A1'].font = Font(bold=True)
# エクセルファイルを保存
workbook.save('sample.xlsx')

このコードを実行すると、A1セルのフォントが太字に変更されます。

セルの結合・分割を行う方法

セルを結合するには、merge_cellsメソッドを使用します。

また、結合したセルを分割するには、unmerge_cellsメソッドを使用します。

以下のサンプルコードでは、A1からB1までのセルを結合し、その後分割する方法を示しています。

# A1からB1までのセルを結合
worksheet.merge_cells('A1:B1')
# エクセルファイルを保存
workbook.save('sample.xlsx')
# セルを分割
worksheet.unmerge_cells('A1:B1')
# エクセルファイルを保存
workbook.save('sample.xlsx')

このコードを実行すると、最初にA1からB1までのセルが結合され、その後分割されます。

これにより、セルのレイアウトを柔軟に変更することができます。

エクセルファイルの保存と書き込み

エクセルファイルを保存する方法

openpyxlを使用してエクセルファイルを保存するには、saveメソッドを使用します。

以下のサンプルコードでは、エクセルファイルを保存する方法を示しています。

from openpyxl import Workbook
# 新しいエクセルファイルを作成
workbook = Workbook()
worksheet = workbook.active
# セルに値を入力
worksheet['A1'] = 'こんにちは'
worksheet['B1'] = '世界'
# エクセルファイルを保存
workbook.save('sample.xlsx')

このコードを実行すると、sample.xlsxという名前のエクセルファイルが作成され、指定した値が入力されます。

上書き保存と別名保存の違い

  • 上書き保存: 既存のファイルに対して、変更を加えた内容をそのまま保存します。

ファイル名は変わらず、内容だけが更新されます。

上書き保存を行うには、同じファイル名でsaveメソッドを呼び出します。

  • 別名保存: 新しいファイル名を指定して保存することで、元のファイルはそのまま残り、新しいファイルが作成されます。

別名保存を行うには、異なるファイル名を指定してsaveメソッドを呼び出します。

以下のサンプルコードでは、上書き保存と別名保存の例を示しています。

# 上書き保存
workbook.save('sample.xlsx')  # 既存のファイルに上書き
# 別名保存
workbook.save('sample_copy.xlsx')  # 新しいファイルを作成

保存時のファイル形式の指定方法

openpyxlは、主に.xlsx形式でエクセルファイルを保存しますが、他の形式で保存することはできません。

もし異なる形式で保存したい場合は、pandasライブラリを使用することを検討する必要があります。

以下のサンプルコードでは、pandasを使用してデータフレームをエクセルファイルとして保存する方法を示しています。

import pandas as pd
# データフレームを作成
data = {'列1': [1, 2, 3], '列2': [4, 5, 6]}
df = pd.DataFrame(data)
# エクセルファイルとして保存
df.to_excel('sample_pandas.xlsx', index=False)

このコードを実行すると、sample_pandas.xlsxという名前のエクセルファイルが作成され、データフレームの内容が保存されます。

pandasを使用することで、より多様なデータ形式での保存が可能になります。

よくある質問

max_rowで正しい最終行が取得できない場合は?

max_rowが正しい最終行を取得できない場合、シート内に空白行が含まれている可能性があります。

max_rowは、データが入力されている最も下の行を返すため、空白行があるとその行もカウントされてしまいます。

この場合、実際にデータが入力されている行を確認するために、ループを使用して各行をチェックする方法が有効です。

具体的には、各行のセルが空でないかを確認し、最終行を特定することができます。

空白行を無視して最終行を取得する方法は?

空白行を無視して最終行を取得するには、iter_rowsメソッドを使用して、各行をループ処理し、データが入力されている最後の行を特定します。

以下のようなコードを使用することで、空白行を無視した最終行を取得できます。

actual_last_row = 0
for row in worksheet.iter_rows(min_row=1, max_col=1, max_row=worksheet.max_row):
    if row[0].value is not None:  # セルが空でない場合
        actual_last_row = row[0].row
print(f'実際の最終行: {actual_last_row}')

この方法を使うことで、空白行を考慮せずに正確な最終行を取得できます。

最終行が動的に変わる場合の対処法は?

最終行が動的に変わる場合、データの追加や削除に応じて最終行を再取得する必要があります。

データを操作するたびに、max_rowや空白行を無視した最終行の取得処理を行うことで、常に最新の最終行を把握できます。

例えば、データを追加した後に再度最終行を取得するコードを実行することで、最新の状態を反映させることができます。

以下のように、データ追加後に最終行を再取得することが重要です。

# データを追加
worksheet.cell(row=actual_last_row + 1, column=1, value='新しいデータ')
# 最終行を再取得
actual_last_row = 0
for row in worksheet.iter_rows(min_row=1, max_col=1, max_row=worksheet.max_row):
    if row[0].value is not None:
        actual_last_row = row[0].row
print(f'更新後の最終行: {actual_last_row}')

このように、データの変更があった際には、必ず最終行を再取得することで、常に正確な情報を得ることができます。

まとめ

この記事では、Pythonのopenpyxlライブラリを使用してエクセルファイルを操作する方法について詳しく解説しました。

エクセルファイルの読み込みから最終行や最終列の取得、データの追加や書式変更、さらにはファイルの保存方法まで、幅広い操作が可能であることがわかりました。

これらの知識を活用して、日常のデータ管理や自動化のタスクを効率的に行うことができるでしょう。

ぜひ、実際にコードを試してみて、エクセルファイルの操作を自分のプロジェクトに取り入れてみてください。

  • URLをコピーしました!
目次から探す