openpyxlでエクセルファイルを編集しているんだけど、
シート内の値に誤字が見つかった。
正しい値に置換したいんだけど、どうしたらいいの?
なるほど…。
では今回は、「openpyxlでセル内の値を置換する方法」を
できるだけわかりやすく解説いたします。
「完全一致」「部分一致」「前方一致」「後方一致」など
いろんなパターンを紹介いたしますので、ぜひ最後まで
読んでいってください。
openpyxlでセル内の値を置換する方法(完全一致)
「replace」を使います。まずは完全一致したときに置換するパターンです。
全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
old_text = 'Utatane'
new_text = 'Atatane'
cell = ws['A1']
if cell.value == old_text:
cell.value = new_text
wb.save('C:/Utatane/output.xlsx')
if cell.value == old_text:
cell.value = new_text
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~ブック・シートの取得
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
上記コードにて、エクセル操作に必要な「openpyxl」のインポートと、エクセルブック・シートを取得しています。
詳細は、「インストール方法」の記事をご参考ください。
置換する値を設定
old_text = 'Utatane'
new_text = 'Atatane'
上記コードにて、置換する値を設定しています。
【コードの解説】
新しい名前の変数を書いたら、「=(イコール)」を書きます。
イコールの後ろには、「置換したい値」を書いてください。
今回はわかりやすく「old_text」という変数名にしましたが、何でも構いません。
しかしながら、つけられない名前があったりしますので、下記記事をご参考ください。
改行したら、次に置換後の値を設定します。
また新しい名前の変数とイコールを書き、「置換後の値」書きましょう。
右辺の値は両方とも「’(クォーテーション)」で囲ってください。
囲わないと、エラーが発生したり、うまく動作しない場合があります。
対象のセルを取得
次に、置換対象のセルを取得します。
cell = ws['A1']
【コードの解説】
再び新しい名前の変数とイコールを書いたら、シートが入った変数(今回はws)と[]を書きます。
[]内には、置換対象のセル名を書いてください。
セル名は「’(クォーテーション)」で囲いましょう。
記事後半の「全セルの値を置換」にて、全てのセルを置換する方法を紹介しております。
セルの値を置換
if cell.value == old_text:
cell.value = new_text
上記コードにて、セル(cell)の値(value)が「old_text(Utatane)」と等しいなら、「new_text(Atatane)」に置き換えるという処理をしています。
if文については、下記記事をご参考ください。
これでセルの値が「old_text(Utatane)」と完全一致した場合のみ、「new_text(Atatane)」に置換されます。
大文字と小文字は区別されます。
今回の場合は、セル内の値が「utatane」なら置換されませんのでご注意ください。
openpyxlでセル内の値を置換する方法(部分一致)
前項では、完全一致した場合の置換方法を解説いたしました。
ここからは、部分一致でも置換する方法を紹介いたします。
下記のコードを見てください。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
old_text = 'Utatane'
new_text = 'Atatane'
cell = ws['A1']
if isinstance(cell.value, str):
cell.value = cell.value.replace(old_text, new_text)
wb.save('C:/Utatane/output.xlsx')
前項から11・12行目が変わっただけです。
if isinstance(cell.value, str):
cell.value = cell.value.replace(old_text, new_text)
「isinstance」は、セルの値の型を判定しています。
「replace」は部分一致の置換を行うというものです。
なので、セルの値がstr(文字列型)なら、「old_text」を「new_text」に置換するという処理になります。
一見すると11行目が不要に見えますが、必要です。
なぜなら、「replace」はint(数値型)には対応していないため、セルの値が「1」などの整数ならエラーが発生してしまいます。
置換したい値が数値の場合は、コードの10行目を下記コードを追記して、数値を文字列型に変換しましょう。
cell = ws['A1']
cell.value = str(cell.value) #これを追加
置換後の数値は文字列型になりますが、不都合なら表示形式を変更してください。
では、プログラムを実行してみましょう。
置換されました。
「Utatane」から始まる値でなくても置換されます。
前方一致で置換
前方一致の場合のみ置換することも可能です。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
old_text = 'Utatane'
new_text = 'Atatane'
cell = ws['A1']
if isinstance(cell.value, str) and cell.value.startswith(old_text):
cell.value = cell.value.replace(old_text, new_text)
wb.save('C:/Utatane/output.xlsx')
前項から11行目が変わっています。
if isinstance(cell.value, str) and cell.value.startswith(old_text):
cell.value = cell.value.replace(old_text, new_text)
「and cell.value.startswith(old_text)」が追加されています。
「startswith」が「前方一致のときのみ」という判断をしています。
実行してみましょう。
「Utatane」から始まる値なら置換されます。
「BlogUtatane」の場合は置換されません。
後方一致で置換
今度は後方一致です。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
old_text = 'Utatane'
new_text = 'Atatane'
cell = ws['A1']
if isinstance(cell.value, str) and cell.value.endswith(old_text):
cell.value = cell.value.replace(old_text, new_text)
wb.save('C:/Utatane/output.xlsx')
同じく11行目の後半が変わっています。
if isinstance(cell.value, str) and cell.value.endswith(old_text):
cell.value = cell.value.replace(old_text, new_text)
「endswith」が後方一致の判断をしているというわけです。
では実行してみましょう。
「Utatane」で終わる値の場合は置換されます。
「UtataneBlog」の場合は置換されません。
全セルの値を置換
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
old_text = 'Utatane'
new_text = 'Atatane'
for row in ws.iter_rows():
for cell in row:
if isinstance(cell.value, str):
cell.value = cell.value.replace(old_text, new_text)
wb.save('C:/Utatane/output.xlsx')
上記コードにて、部分一致の場合の置換を全セルで行っております。
これまで解説した処理に加えて、「for文」で全セルを処理しております。
for文については、下記記事をご参考ください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでセル内の値を置換する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!