利用Python製作Excel關鍵字搜尋器

更新 發佈閱讀 12 分鐘

或許有人會說,windows搜尋就已經支援這個功能了,但是我試用了一下,好像沒有很好用,我寫的這篇就是針對Excel的檔案做關鍵字的搜尋,並會在最後列出包含該關鍵字的檔案資訊。
之所以做這個東西,主要是在追朔我的工作日誌的時候,常常要一直去翻找我們過去的execel檔案,其實很浪費時間,用了這個小工具,只要關鍵字能夠記得,就可以找到過去何時所做的這個紀錄。

vocus|新世代的創作平台
  1. 執行該程式後選擇我的資料夾,該Python檔案支援子目錄搜尋因此在以下範例中,將會搜尋所該資料夾內的所有資料夾的excel檔案。
    vocus|新世代的創作平台
  2. 輸入關鍵字,根據我們的條件來設定搜尋字串與其他考量的細節。
    vocus|新世代的創作平台
  3. 等待搜尋並得到最後的結果,接下來就可以在result.txt中得到我們的相關資訊。
    vocus|新世代的創作平台
  4. Python範例程式如下:
    import sys
    import os
    import pandas as pd
    import tkinter as tk
    from tkinter import filedialog, messagebox

    # === 自訂輸入視窗 ===
    class KeywordDialog(tk.Toplevel):
    def __init__(self, parent):
    super().__init__(parent)
    self.title("輸入關鍵字")
    self.geometry("350x220")
    self.resizable(False, False)

    tk.Label(self, text="請輸入要搜尋的關鍵字:").pack(pady=(10, 5))
    self.keyword_var = tk.StringVar()
    self.entry = tk.Entry(self, textvariable=self.keyword_var, width=30)
    self.entry.pack()

    self.case_var = tk.BooleanVar(value=False)
    tk.Checkbutton(self, text="區分大小寫", variable=self.case_var).pack(pady=5)

    self.first_only_var = tk.BooleanVar(value=False)
    tk.Checkbutton(self, text="找到第一個就停止(每個 Excel 檔只列第一個 sheet)",
    variable=self.first_only_var, wraplength=300, justify="left").pack(pady=5)

    btn_frame = tk.Frame(self)
    btn_frame.pack(pady=10)
    tk.Button(btn_frame, text="確定", width=10, command=self.on_ok).pack(side=tk.LEFT, padx=5)
    tk.Button(btn_frame, text="取消", width=10, command=self.on_cancel).pack(side=tk.LEFT, padx=5)

    self.result = None
    self.protocol("WM_DELETE_WINDOW", self.on_cancel)
    self.entry.focus_set()
    self.wait_window(self)

    def on_ok(self):
    keyword = self.keyword_var.get().strip()
    case_sensitive = self.case_var.get()
    first_only = self.first_only_var.get()
    if keyword:
    self.result = (keyword, case_sensitive, first_only)
    self.destroy()

    def on_cancel(self):
    self.result = None
    self.destroy()

    # === 主程式 ===
    root = tk.Tk()
    root.withdraw()

    # 選擇資料夾
    folder_path = filedialog.askdirectory(title="請選擇要搜尋的資料夾")
    if not folder_path:
    messagebox.showinfo("提示", "未選擇資料夾,程式結束。")
    exit()
    # 輸入關鍵字 + 區分大小寫 + 只列第一個選項
    dialog = KeywordDialog(root)
    if not dialog.result:
    messagebox.showinfo("提示", "未輸入關鍵字,程式結束。")
    exit()

    keyword, case_sensitive, first_only = dialog.result

    # 結果輸出到 py 同目錄
    #output_file = os.path.join(os.path.dirname(__file__), "result.txt")
    # exe 路徑判斷
    if getattr(sys, 'frozen', False):
    # 如果是打包後 exe
    base_path = os.path.dirname(sys.executable)
    else:
    # 如果是直接用 py
    base_path = os.path.dirname(__file__)

    output_file = os.path.join(base_path, "result.txt")
    found_records = []

    # 搜尋 Excel
    # 搜尋 Excel(包含所有子資料夾)
    for root_dir, _, files in os.walk(folder_path):
    for file_name in files:
    if file_name.lower().endswith((".xlsx", ".xls")):
    file_path = os.path.join(root_dir, file_name)
    try:
    xls = pd.ExcelFile(file_path)
    for sheet_name in xls.sheet_names:
    df = pd.read_excel(
    file_path,
    sheet_name=sheet_name,
    header=None,
    dtype=str
    )

    if not case_sensitive:
    mask = df.apply(
    lambda col: col.str.contains(keyword, case=False, na=False)
    )
    else:
    mask = df.apply(
    lambda col: col.str.contains(keyword, case=True, na=False)
    )

    positions = [
    (r + 1, c + 1)
    for r, c in zip(*mask.to_numpy().nonzero())
    ]

    if positions:
    pos_str = ", ".join(
    [f"(列{r},欄{c})" for r, c in positions]
    )
    found_records.append(
    f"{file_path} -> {sheet_name} : {pos_str}"
    )

    if first_only:
    break
    except Exception as e:
    print(f"讀取失敗: {file_path}, 原因: {e}")

    # 輸出結果
    with open(output_file, "w", encoding="utf-8") as f:
    f.write(f"搜尋關鍵字:{keyword} (區分大小寫:{case_sensitive}, 只列第一個 sheet:{first_only})\n\n")
    if found_records:
    f.write("找到以下檔案與工作表包含關鍵字:\n")
    f.write("\n".join(found_records))
    else:
    f.write("未找到包含指定關鍵字的檔案。")

    messagebox.showinfo("搜尋完成", f"搜尋完成!結果已輸出到:\n{output_file}")
  5. 或到此下載.py檔案:
    https://drive.google.com/file/d/1bClOQf95g9xRWeEXd0GVuIzpmTMzY4ga/view?usp=drivesdk


留言
avatar-img
k07110隨手記
0會員
11內容數
主要是記錄一些我工作上有可能用到又常忘記的小東西,或者是我用AI寫出來的小工具之類,畢竟學的程式語言多了,格式大同小異,有時候難免錯亂。
你可能也想看
Thumbnail
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
Thumbnail
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
數學為我們提供了豐富多彩的素材用以學習程式設計:從讀者已掌握的知識(例如繪製一個抛物線,計算一個函數的導數)到未知的領域(如求一個複雜函數的極值),這期間有驗證的快樂,也有探索的艱辛,在不斷重複這些活動的過程中學會熟練運用這一工具,工具的熟練使用反過來也會幫助我們對特定問題進行更為深入的探討與研究。
Thumbnail
數學為我們提供了豐富多彩的素材用以學習程式設計:從讀者已掌握的知識(例如繪製一個抛物線,計算一個函數的導數)到未知的領域(如求一個複雜函數的極值),這期間有驗證的快樂,也有探索的艱辛,在不斷重複這些活動的過程中學會熟練運用這一工具,工具的熟練使用反過來也會幫助我們對特定問題進行更為深入的探討與研究。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
Thumbnail
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文介紹如何使用Python、PyTorch和yfinance建立三層式類神經網路模型預測股票價格,並結合管制圖進行數據健康性檢視,有機會提供更全面的投資分析參考。
Thumbnail
本文介紹如何使用Python、PyTorch和yfinance建立三層式類神經網路模型預測股票價格,並結合管制圖進行數據健康性檢視,有機會提供更全面的投資分析參考。
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News