困りごと
仕事を変えて 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に大感謝。