openpyxlでエクセルファイルを編集しているんだけど、
結合セルを解除したら空白だらけになってしまった…。
これらの空白セルに上のセルの値をコピーしたいんだけど、
どうしたらいいんだろう…。
なるほど…。
では今回は、「openpyxlで空白セルを隣のセルの値で埋める方法」を
できるだけわかりやすく解説いたします。
「左」や「右」「下」のセルの値で埋めることもできますので、
ぜひ最後まで読んでいってください。
openpyxlで空白セルを隣のセルの値で埋める方法
「offset」を使います。
まずは、セル1つの例で考えてみましょう。
全コード
ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
cell = ws['A2']
if cell.value is None:
above = cell.offset(-1,0)
cell.value = above.value
wb.save('C:/Utatane/output.xlsx')
if cell.value is None:
above = cell.offset(-1,0)
cell.value = above.value
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~ブック・シートの取得
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
上記コードにて、エクセル操作に必要な「openpyxl」のインポートと、エクセルブック・シートを取得しています。
詳細は、「インストール方法」の記事をご参考ください。
対象のセルを取得
次に、対象のセルを取得します。
今回はA2セルを取得しています。
cell = ws['A2']
【コードの解説】
新しい名前の変数を書いたら、「=(イコール)」を書きます。
今回はわかりやすく、「cell(セル)」という名前にしましたが、何でも構いません。
しかしながら、つけられない名前があったりしますので、下記記事をご参考ください。
イコールの後ろには、シートが入った変数(今回はws)と[]を書きます。
[]内には、対象のセル名を書いてください。
セル名は「’(クォーテーション)」で囲いましょう。
記事後半の「全ての空白セルを隣のセルの値で埋める方法」にて、全セルを取得して埋める方法を紹介しております。
空白の判定~隣のセルの値をコピー
if cell.value is None:
above = cell.offset(-1,0)
cell.value = above.value
ifでセルが「空白」か「空白でない」かを判定しています。
セルが空白なら隣のセル(今回は上のセル)の値をコピーするといった処理です。
空白の判定方法は下記記事をご参考ください。
9行目から詳しく解説いたします。
【コードの解説:9行目】
新しい名前の変数(今回はabove)を書いたら、イコールを書きます。
イコールの後ろには「取得したセルが入った変数」に続けて、「.offset(-1,0)」を書きます。
「offset」で隣のセルを取得します。
- offset(-1,0):1つ上のセルを取得
- offset(1,0):1つ下のセルを取得
- offset(0,-1):1つ左のセルを取得
- offset(0,1):1つ右のセルを取得
【コードの解説:10行目】
セルを取得した変数(今回はcell)に続けて、「.value」を書きます。
そしてイコールを書いたら、隣のセルを取得した変数(今回はabove)に続けて、「.value」を書きます。
なぜ「.value」が必要なのかというと、
「cell」も「above」も値だけではなく、セルの情報も含まれています。
なので、「.value」とすることで、セルの値(value)のみをやりとりしているわけです。
全ての空白セルを隣のセルの値で埋める方法
ここからが本番です。
下図を見てください。
冒頭の会話のように空白セルがいくつかあります。
これらの空白セルに上のセルの値をコピーしてみましょう。
ではコードをご覧ください。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
for row in ws.iter_rows():
for cell in row:
if cell.value is None:
above = cell.offset(-1,0)
cell.value = above.value
wb.save('C:/Utatane/output.xlsx')
上記コードを実行することで、下図のように空白を埋めることができます。
コードはいたってシンプルで、これまで解説した処理を「for文」を使って繰り返しています。
for文については下記記事をご参考ください。
「iter_rows」もよく使うかと思いますので、押さえておきましょう。
「offset」を使う際の注意点
隣のセルを取得できる「offset」ですが、隣のセルも空白だった場合、空白が取得されますのでご注意ください。
また、右や下のセルを取得する場合も注意が必要です。
全セルを取得する「iter_rows」や「iter_cols」は左上のセル(A1セル)から取得し始めるため、相性が悪いです。
空白が連続する場合は表が埋まらない可能性があります。
▼offsetで下のセルから値を取得した見本
同じ処理を何度も繰り返せば埋まる場合がありますが、「Pandas」の「DataFrame」を使う方が無難です。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで空白セルを隣のセルの値で埋める方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!