このドキュメントどこにあるの?
データ仕様とかがエクセルで定義されている場合があるんですがGrepでは難しいですよね。
もちろん、excelファイル自体はzipなので解凍してXMLをgrepすれば…できなくはないのですが整形済みで結果を見たいですので今回はやめておきました。
また、VBA使ってマクロでできるのですが、マクロ形式の拡張子のファイル作ったり結構面倒くさいのでこの方法も却下です。
ということで、いつものコマンドからサクッと検索できる方が良いと思うので作ってみました。
ソースコード
requirements.txt
openpyxl
pandas
grep_excel.py
import os
import pandas as pd
from openpyxl import load_workbook
import sys
def grep_excel(folder_path, search_word):
"""
指定ディレクトリの以下のEXCELファイルを再帰的に検索する
:param folder_path: 検索するディレクトリパス
:param search_word: 検索ワード
"""
# 検索結果を保存するリスト
results = []
# フォルダ内のすべてのファイルを再帰的に走査
for root, dirs, files in os.walk(folder_path):
for file_name in files:
# ~$で始まるファイルを除外
if (file_name.endswith(".xlsx") or file_name.endswith(".xlsm")) and not file_name.startswith("~$"):
file_path = os.path.join(root, file_name)
# Excelファイルを開く
wb = load_workbook(file_path, data_only=True)
# すべてのシートをループ
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
# シート内のすべてのセルをループ
for row in sheet.iter_rows():
for cell in row:
if cell.value and search_word.lower() in str(cell.value).lower():
# 検索ワードが見つかった場合、結果をリストに追加
results.append({
'ファイル名': file_name,
'シート名': sheet_name,
'セルアドレス': cell.coordinate,
'セルの内容': cell.value,
'ファイルパス': file_path # ファイルパスも結果に追加
})
# 検索結果をDataFrameに変換
df = pd.DataFrame(results)
# 結果を表示
if not df.empty:
print(df)
else:
print("指定したワードが含まれるセルは見つかりませんでした。")
return df
if __name__ == "__main__":
# コマンドライン引数から検索対象のフォルダと検索ワードを取得
if len(sys.argv) != 3:
print("使用方法: python grep_excel.py <フォルダパス> <検索ワード>")
sys.exit(1)
# 検索処理の実行
result_df = grep_excel(sys.argv[1], sys.argv[2])
# 結果をExcelに出力する場合
output_path = '検索結果.xlsx'
result_df.to_excel(output_path, index=False)
print(f"検索結果が {output_path} に保存されました。")
使い方
ライブラリのインストール
pip install -r requirements.txt
実行
python grep_excel.py path/to/excel_dir 検索したいワード