openpyxlでエクセルファイルを編集しているんだけど、
「Sheet1」と同じような表を「Sheet2」にも作りたい….。
セルの背景色を取得したり、コピーする方法は無いの?
なるほど…。
では今回は、「openpyxlでセルの背景色を取得する方法」を
できるだけわかりやすく解説いたします。
「別シートにコピーする方法」も紹介いたしますので、
ぜひ最後まで読んでいってください。
openpyxlでセルの背景色を取得する方法
「PatternFill」を使います。
まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
from openpyxl.styles import PatternFill
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']
cell1 = ws1['A1']
cell2 = ws2['A1']
cell2.fill = PatternFill(patternType=cell1.fill.patternType, fgColor=cell1.fill.fgColor)
wb.save('output.xlsx')
cell2.fill = PatternFill(patternType=cell1.fill.patternType, fgColor=cell1.fill.fgColor)
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポートなどの基礎解説は、下記記事をご参考ください。
セルを変数に代入
cell1 = ws1['A1']
cell2 = ws2['A1']
上記コードにて、「Sheet1」と「Sheet2」の「A1セル」をひとまず変数に代入しています。
何でもいいので変数名を書いたら、「=」を書きます。
続けてワークシートが入った変数の後に[‘セル名’]を書いたら完了です。
変数名の付け方や変数に関する解説は、下記記事で行っておりますのでご参考ください。
背景色の取得・コピー
ここからが本題です。
少し長いですが、簡単ですので見ていきましょう。
cell2.fill = PatternFill(patternType=cell1.fill.patternType, fgColor=cell1.fill.fgColor)
上記一文にて、「セルの背景色」を取得し、別の場所にコピーすることができます。
コピー元は前項で変数に代入した「Sheet1のA1セル」で、コピー先は「Sheet2のA1セル」です。
「コピー先のセル」を代入した変数(今回はcell2)を書いたら、続けて「.fill」を書きます。
「.fill」を書くことによって、「セルの背景を設定する」という意味だと思ってください。
「=」を書いたら、続けて「PatternFill()」を書きます。
「PatternFill」は大文字と小文字が混在しているのでご注意ください。
全て小文字にすると動作しません。
()内には、取得する下記の2種類を記述します。
- patternType:背景のタイプ(塗りつぶしなのか網掛けなのか)
- fgColor:背景の色
「patternType」「fgColor」についても、大文字・小文字にご注意ください。
<patternType>
【 patternType=コピー元の変数.fill.patternType 】
※コピー元のセルの背景のタイプを取得するという意味です
<fgColor>
【 fgColor=コピー元の変数.fill.fgColor 】
※コピー元のセルの背景の色を取得するという意味です
これで、「コピー元のセル」の背景(タイプと色)を取得して、「コピー先のセル」にコピーすることができます。
しかしながら、これでは1つのセルしかコピーできていません。
複数のセルの背景色をコピーする方法は次項で紹介いたします。
複数のセルの背景色を一括で取得・コピーする方法
import openpyxl
from openpyxl.styles import PatternFill
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']
r = 0
c = 0
for row1 in ws1 :
c = 1
r = r + 1
for cell1 in row1 :
ws2.cell(row=r, column=c).fill = PatternFill(patternType=cell1.fill.patternType, fgColor=cell1.fill.fgColor)
c = c + 1
wb.save('output.xlsx')
基本的には前項で解説したものをfor文でループさせています。
セルの指定やfor文の基礎解説は下記記事で行っておりますので、ご参考ください。
- セルの指定方法:openpyxlで既存のエクセルファイルに文字を書き込みする方法
- for文の基礎:[Python]openpyxlで使えるfor文の基礎
<ざっくり解説>
背景色を取得するセルの指定は、変数を利用しています。
変数「c」と「r」を作り、列は変数「c」、行は変数「r」を指定します。
for文が進むにつれて「c」と「r」を1ずつ増やすことで最後まで背景色を取得・コピーすることができます。
※最初はA1(column=1, row=1)、次はB1(column=2, row=1)という具合です。
同様に罫線をコピーすることもできます。方法は別の記事をご参考ください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでセルの背景色を取得する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!