【Python×Openpyxl】Excelファイルから特定書式が含まれるセルアドレスを取得する方法

こんにちは。てちてちエンジニアのおっとーです。

 

Excelファイルから特定の書式を洗い出したいなんて需要有ったりするんじゃないでしょうか。

今回はそんなときに使用できるPythonプログラムを紹介します。

 

投稿の最後に今回紹介するコードをまとめてます。

コピペする方は目次のさいごまで飛んでください。

 

openpyxlのインストール

今回はPythonからExcelファイルを読み込むためにopenpyxlというパッケージをインストールします。

pip install openpyxl

 

パッケージをインポート

Pythonファイルからパッケージを読み込みます。

openpyxl.utilsは便利な関数が詰め込まれています。
今回はutils.cellに含まれるget_column_letter関数で列番号に対するアルファベットを取得してます。

import openpyxl
import openpyxl.utils

 

ワークシートを読み込む

wb = openpyxl.load_workbook('path/to/filename.xlsx')
ws = wb['シート名']

 

有効セル(使用済みセル)から取り消し線を含むセルを全て書き出す

有効セルを左上から右下方向へ判定していき、取り消し線が使用されている場合そのセルの番地を書き出します。

上図のような状態だとB2からG10までが有効セルです。

for row in range(ws.min_row, ws.max_row + 1): 
    for column in range(ws.min_column, ws.max_column + 1):
        if ws.cell(row=row,column=column).font.strike:
            print(f'{openpyxl.utils.get_column_letter(column)}{row}') #結果 B2、C8 
            print(f'({row},{column})') # 結果(2,2) (8,3)

注:range関数で行数と列数を回す際、終了行列は最大行列に+1を忘れないこと!

 

他の書式を書き出してみる

ifws.cell(row=row,column=column).font.strike:
    ....

この行の「strike」が取り消し線を意味しているので、変更すれば他の書式にも対応可能。

strike もしくは strikethrough取り消し線
b もしくは bold太字
i もしくは italic斜体
u もしくは underline下線

 

文字色が使用されているセル探してみる

font.colorを取得するとオブジェクトが取得される。

その中のrgbプロパティにカラーコードが返されるので、下記のように文字列でカラーコードの判定を行うことで、

特定の文字色が使用されているセルを洗い出すことができる。

ifws.cell(row=row,column=column).font.color.rgb =='カラーコード':
    ....

さいごに

一定条件を満たしたセルに対して何かしら操作を行う機会は多いと思います。

今回紹介した有効セル範囲に対するループの回し方と判定条件の組み合わせが一助となれば幸いです。

import openpyxl
import openpyxl.utils

wb = openpyxl.load_workbook('path/to/filename.xlsx')
ws = wb['シート名']

for row in range(ws.min_row, ws.max_row + 1):
    for column in range(ws.min_column, ws.max_column + 1):

        if ws.cell(row=row,column=column).font.strike:
            # 取り消し線の処理

        if ws.cell(row=row,column=column).font.u:
            # 下線時の処理

        if ws.cell(row=row,column=column).font.b:
            # 太字時の処理

        if ws.cell(row=row,column=column).font.i:
            # 斜体時の処理

        if ws.cell(row=row,column=column).font.color.rgb == 'カラーコード':
            # 指定カラーコード時の処理
タイトルとURLをコピーしました