送られてきたエクセルファイルの最終行に必ず合計値が入っている。
集計するのに不要だから削除したい。
データの行数は毎回違ってて、最終行を取得できれば削除できるんだけど…。
openpyxlで値が入っている最終行を取得する方法は無いの?
あります!
今回は、Pythonのopenpyxlを使って
「値が入っている最終行を取得する方法」と
「取得する際の注意点」
「最終行の値を取得する方法」を
できるだけわかりやすく解説いたします!
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
openpyxlで値が入っている最終行を取得する方法
「max_row」を使います。まずは実行見本をどうぞ。
実行見本
下記のコードは、エクセルの最終行である6行目を削除した例です。
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
last_row = ws.max_row
ws.delete_rows(last_row)
print('最終行は' + str(last_row) + '行目')
wb.save('C:/Utatane/output.xlsx')
実行結果:最終行は6行目
last_row = ws.max_row
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
last_row = ws.max_row
ws.delete_rows(last_row)
「ws.max_row」と記述することで、変数「ws」の値が入っている最終行を取得することができます。
注意したいのは「最終行の値」ではなく、「最終行の行数」です。
今回の例なら6行目が最終行なので、「6」が取得されます。
<テンプレ>
【 変数 = ワークシートが入った変数.max_row 】
取得した行数を別の変数に代入し、その行を削除して完了です。
変数について詳しく知りたい方は下記記事をご参考ください。
行を削除する方法は別の記事にて解説しております。
値が入っている最終行を取得する際の注意点
前項で紹介しました「値が入っている最終行の取得」ですが、
便利なように見えて注意すべき点あります。
下図をご覧ください。
前項の見本と同じに見えますが、A8セルに塗りつぶしが入っています。
では、前項同様に最終行を削除してみましょう。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
last_row = ws.max_row
ws.delete_rows(last_row)
print('最終行は' + str(last_row) + '行目')
wb.save('C:/Utatane/output.xlsx')
最終行であるはずの合計値が削除されていません。
その代わりに、塗りつぶしがある行が削除されています。
わかりやすように、最終行を「print」で表示させていました。
実行結果を見てみましょう。
print('最終行は'+last_row+'行目')
実行結果:最終行は8行目
最終行は8行目。つまり塗りつぶしのある行が最終行と認識されてしまっています。
このようにセルに塗りつぶしや罫線などの装飾がある場合、そのセルも含まれることをになりますのでご注意ください。
また、セルに空白を示す数式が入っている場合も同様です。
実行結果:最終行は8行目
対処法
塗りつぶしや空白の数式を取得してしまう場合の対処法ですが、以下の通りです。
- 塗りつぶしや罫線など:「iter_rows()」を使う
- 空白の数式:「値貼り付け」+「iter_rows()」を使う
塗りつぶしや罫線は「iter_rows()」で別シートに丸々コピーした後、前項のコードを実行することで対処できます。
import openpyxl
wb_in = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws_in_1 = wb_in['Sheet1']
ws_in_2 = wb_in['Sheet2']
for row in ws_in_1.iter_rows():
new_row = [cell.value for cell in row]
ws_in_2.append(new_row)
wb_in.save('C:/Utatane/output.xlsx')
wb_out = openpyxl.load_workbook('C:/Utatane/output.xlsx')
ws_out = wb_out['Sheet2']
last_row = ws_out.max_row
ws_out.delete_rows(last_row)
print('最終行は' + str(last_row) + '行目')
wb_out.save('C:/Utatane/output.xlsx')
実行結果:最終行は6行目
「iter_rows()」の使い方は下記記事をご参考ください。
空白の数式は、「値貼り付け」の後、「iter_rows()」を使います。
import openpyxl
wb_in = openpyxl.load_workbook('C:/Utatane/input.xlsx', data_only = True)
ws_in_1 = wb_in['Sheet1']
ws_in_2 = wb_in['Sheet2']
for row in ws_in_1.iter_rows():
new_row = [cell.value for cell in row]
ws_in_2.append(new_row)
wb_in.save('C:/Utatane/output.xlsx')
wb_out = openpyxl.load_workbook('C:/Utatane/output.xlsx')
ws_out = wb_out['Sheet2']
last_row = ws_out.max_row
ws_out.delete_rows(last_row)
print('最終行は' + str(last_row) + '行目')
wb_out.save('C:/Utatane/output.xlsx')
実行結果:最終行は6行目
値貼り付けの詳細解説は下記記事をご参考ください。
ちょっとめんどうですが、いろんな方法を勉強し直せるチャンスだと思ってがんばりましょう!
最終行の値を取得する方法
今度は、最終行の行数ではなく、最終行の値を取得する方法を紹介いたします。
下図をご覧ください。
今回は最終行であるA5セルの値を取得する方法です。
コードにしたのが下記となります。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
last_row = ws.max_row
last_row_value = ws['A'+str(last_row)].value
print('最終行の値は、A' + str(last_row) + ':' + last_row_value)
wb.save('C:/Utatane/output.xlsx')
実行してみましょう。
最終行の値は、A5:お
と表示されました。成功です。
B列の最終行を取得したい場合は、コードの8行目・10行目の「A」を「B」に変えてください。
うまく動作しない時
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで値が入っている最終行を取得する方法を解説いたしました。
注意点さえ気を付ければ便利な技ですので、必要に応じてご活用ください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!