messyなkitchenなブログ

ただひたすらに散らかった台所や人生やその他を晒す。

MENU

Excel仕様書の中で探し物をする

困りごと

仕事を変えて 3ケ月。

何が良くて シート数 100 以上を持つ Excelファイルを使っているのか。 しかも 1ファイルだけならともかく、そんなファイルが 数100個、しかも深いフォルダ階層に散らかっている。

設計書類がこんな感じなので、仕様がどこに書いてあるのか見つけるのが一苦労どころか大苦労。
それなりの規模の企業でもこんな感じなのは、いかがなものか...

と言ってもしょうがない、こういう環境の開発業務なので従うしかない。
ということで、目と首と肩の疲労を軽減するために、検索処理をいっちょ作ってみるか。。。

step 1

生成AIを使って、Excelファイルの中に検索ワードが含まれるかどうかを調べる pythonコードを作りました。
なお、動作確認したのは Windows 環境です。

import openpyxl

def search_word_in_xlsx(filepath, search_word):
    try:
        # 指定されたファイルパスのExcelファイルを読み込む
        wb = openpyxl.load_workbook(filepath)
        # すべてのシートを順に処理する
        for sheet in wb.worksheets:
            # シート内のすべての行を順に処理する
            for row in sheet.iter_rows():
                # 行内のすべてのセルを順に処理する
                for cell in row:
                    # セルの値が検索ワードを含むか確認する
                    if search_word in str(cell.value):
                        # 検索ワードが見つかった場合はTrueを返す
                        return True
        # 検索ワードが見つからなかった場合はFalseを返す
        return False
    except Exception as e:
        # エラーが発生した場合はエラーメッセージを表示し、Falseを返す
        print(f'Error: {filepath} : {e}')
        return False

ということで、Excelファイルのパスと検索ワードを与えることで、 Excelファイルのすべてのシートのすべてのセルを探索する関数ができました。
生成AIに感謝。

step 2

上記の関数を連続で実行できるようにします。
フォルダを指定し、そのフォルダ配下を網羅します。

import os

def search_word_in_files(directory, search_word):
    # ファイル名を格納するリストを初期化
    result_files = []
    count = 0

    # 指定されたディレクトリ内を再帰的に探索
    for root, dirs, files in os.walk(directory):
        for filename in files:
            filepath = os.path.join(root, filename)
            fname = filename.lower()
            # ファイルがExcelファイル(.xlsx または .xlsm)であるか確認
            if fname.endswith(".xlsx") or fname.endswith(".xlsm"):
                count += 1
                # Excelファイルに探索ワードが含まれるかどうかチェック
                if search_word_in_xlsx(filepath, search_word):
                    result_files.append(filepath)

    # 探索ワードが含まれているファイルのリストを返す
    return result_files

これらのコードを利用することで、指定フォルダ配下の Excelファイルの中から、 任意の文字列を検索できるようになりました。

検索に時間はかかるけれど、1個1個を開いて検索ウインドウを開いて検索ワードを入力して・・・ というような手続きからは解放されました。

生成AIに大感謝。