【openpyxl】セル内の値を置換【完全一致・部分一致(前方一致・後方一致)】

スポンサードリンク
Python
過去の自分
過去の自分

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) #これを追加

置換後の数値は文字列型になりますが、不都合なら表示形式を変更してください。

では、プログラムを実行してみましょう。

部分一致置換の見本1

置換されました。
「Utatane」から始まる値でなくても置換されます。

部分一致置換の見本2

前方一致で置換

前方一致の場合のみ置換することも可能です。

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を独学で学習する方法は特におすすめです。

最後までお読みいただき、ありがとうございました。がんばってください!

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