送られてきたエクセルファイルなんだけど、
特定の列の数値を合算しようとしたところ、1ヵ所に取り消し線が入っていた…。
openpyxlで取り消し線を判定する方法は無いの?
ありますよ!
「openpyxlで取り消し線を判定して除外する方法」を
できるだけわかりやすく解説いたします!
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
openpyxlで取り消し線を判定して除外するには
「strike」を使います。まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
if ws['A1'].font.strike is None or cell.font.strike == False:
ws['B1'].value = ws['A1'].value
else :
ws['B1'].value = 0
if ws['A2'].font.strike is None or cell.font.strike == False:
ws['B2'].value = ws['A2'].value
else :
ws['B2'].value = 0
wb.save('C:/Utatane/output.xlsx')
if ws['A1'].font.strike is None or cell.font.strike == False:
ws['B1'].value = ws['A1'].value
else :
ws['B1'].value = 0
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
if ws['A1'].font.strike is None or cell.font.strike == False:
ws['B1'].value = ws['A1'].value
else :
ws['B1'].value = 0
上記コードにて、「A1セル」に取り消し線が引かれているか判定しています。
取り消し線が引かれていない場合は「B1セル」に「A1セルの値をそのまま書き込み」して、引かれている場合は「B1セル」に「0」を書き込みしています。
if文を使って取り消し線を判定しており、「strike」が取り消し線のことです。
これが「None または False(取り消し線なし)」か「else(それ以外)」がで処理を分けています。
if文については下記記事をご参考ください。
今回は「A1セル」に取り消し線が引かれているので、「B1セル」に「0」が書き込みされます。
これで取り消し線が引かれているセルが除外されました。
次に、「A2セル」を見てみましょう。
if ws['A2'].font.strike is None or cell.font.strike == False:
ws['B2'].value = ws['A2'].value
else :
ws['B2'].value = 0
コードは「A1セル」を判定した時と同じです。
「A2セル」には取り消し線が引かれていませんので、「B2セル」に「1000」が書き込みされます。
もう少し実践的な例を見ていきましょう。
できるだけ簡単にしていますので、次項をぜひご覧ください。
取り消し線が入ったセルを除外して合計値を出す
前項で解説した「取り消し線の除外」を利用して、セルの合計を出してみましょう。
下図のように「A1~A10セル」に数値が入っています。
ただし「A6セル」の「6」だけは「取り消し線」が引かれています。
取り消し線が引かれたセルを除外して、「A1~A10セル」の合計を計算してみましょう。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
total = 0
for row in range(1, 11):
cell = ws[f'A{row}']
if cell.font.strike == False:
if isinstance(cell.value, (int, float)):
total += cell.value
ws['A11'] = total
wb.save('C:/Utatane/output.xlsx')
想定どおり「6」だけが除外されて、合計値である「49」がA11セルに書き込みされました。成功です。
ざっくりとコードを解説します。
【6行目】
変数「total」を作り、0を代入します(合計値を保存するのに使います)
【7行目~12行目(for文でループ)】
A1~A10セルを順番にループするように設定をしています。
変数「cell」を作り、「ループ1回目はA1、2回目はA2」というように、各セルを順番に一時保管します。
10行目:変数「cell」に取り消し線が無ければ、変数「total」に数値を加算しています。
(isinstanceで数値であることを確認し、数値なら変数「total」に数値を加算)
【14行目】
変数「total」に入っている合計値を「A11セル」に書き込みして完了です。
うまく動作しない時
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで取り消し線を判定して除外する方法を解説いたしました。
取り消し線を入れるなら行ごと削除しろよと思いたくなりますが、いろんな事情があると思って我慢しましょう。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!