首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作 Excel 文件全文搜尋:Range.Find vs 儲存格逐一掃描兩種方案比較

     編輯:關於C語言

需求:掃描 Excel 活頁簿所有工作表尋找關鍵字

Excel 物件模型無 Find 物件 (Word 有),但 Range 提供 Find() 方法。另一種方式是取得 UsedRange 逐列逐欄掃描 Cells[i,j].Text。

方案一:Range.Find 高效搜尋 (推薦)


using Excel = Microsoft.Office.Interop.Excel;

public bool SearchWorkbook(string filePath, string keyword)
{
    var app = new Excel.Application();
    try
    {
        var wb = app.Workbooks.Open(filePath, ReadOnly: true);
        string searchText = keyword.Trim().ToUpper();
        
        foreach (Excel.Worksheet ws in wb.Worksheets)
        {
            // 索引從 1 開始!非 0
            Excel.Range used = ws.UsedRange;
            Excel.Range found = used.Find(
                What: searchText,
                LookIn: Excel.XlFindLookIn.xlValues,
                LookAt: Excel.XlLookAt.xlPart,
                SearchOrder: Excel.XlSearchOrder.xlByRows,
                SearchDirection: Excel.XlSearchDirection.xlNext,
                MatchCase: false
            );
            
            if (found != null)
            {
                // 找到:found.Row, found.Column 為位置
                wb.Close(false);
                return true;
            }
        }
        wb.Close(false);
        return false;
    }
    finally
    {
        app.Quit();
        // 建議 Marshal.ReleaseComObject 清理
    }
}

關鍵參數說明

  • LookIn:xlValues (值)、xlFormulas (公式)、xlComments (批註)
  • LookAt:xlPart (部分符合)、xlWhole (完整符合)
  • SearchDirection:xlNext (向下/向右)、xlPrevious (向上/向左) —— 必須明確指定,不可用 Type.Missing
  • 工作表集合索引 從 1 開始 (非 0 基底)

方案二:UsedRange 逐儲存格掃描 (教學/特殊需求)


foreach (Excel.Worksheet ws in wb.Worksheets)
{
    Excel.Range used = ws.UsedRange;
    int startRow = used.Row;        // 起始列 (通常 1)
    int startCol = used.Column;     // 起始欄 (通常 1)
    int rowCount = used.Rows.Count;
    int colCount = used.Columns.Count;

    // 特殊現象:單一儲存格 UsedRange 索引從 1 開始;多儲存格從 0 開始?
    // 實測:Cells 集合索引**永遠從 1 開始** (Excel 物件模型一致)
    for (int r = startRow; r < startRow + rowCount; r++)
    {
        for (int c = startCol; c < startCol + colCount; c++)
        {
            string cellText = ((Excel.Range)used.Cells[r, c]).Text?.ToString() ?? "";
            if (cellText.ToUpper().Contains(searchText))
                return true; // 找到
        }
    }
}

效能與適用場景比較

指標Range.Find逐儲存格掃描
速度極快 (C++ 內建搜尋)慢 (每儲存格跨程序呼叫)
記憶體低高 (大量 COM 呼叫)
搜尋公式結果支援 (LookIn=xlValues)僅顯示文字
搜尋隱藏儲存格可控制全部掃描
適用場景一般全文搜尋需自訂比對邏輯/正則表達式

大型檔案優化建議

  • 唯讀模式開啟 Workbooks.Open(..., ReadOnly: true)
  • 關閉螢幕更新 app.ScreenUpdating = false
  • 考慮使用 OpenXML SDK 或 EPPlus 純 .NET 讀取,無需安裝 Excel、速度更快、支援伺服器端
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved