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

C# 取得 Excel 所有工作表名稱:OleDb GetOleDbSchemaTable 完整實作

     編輯:關於C#

核心方法

OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null) 可取得 Excel 檔案的結構描述資訊,包含所有工作表、命名區域等物件。透過過濾 TABLE_NAME 欄位即可列出使用者可見的工作表名稱。

完整實作代碼

private string[] GetExcelSheetNames(string filePath)
{
    string ext = Path.GetExtension(filePath).ToLower();
    string connStr = ext == ".xls"
        ? "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"
        : "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'";

    using (var conn = new OleDbConnection(connStr))
    {
        conn.Open();
        // 取得 Tables 結構描述
        DataTable schema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        if (schema == null) return Array.Empty();

        var list = new List();
        foreach (DataRow row in schema.Rows)
        {
            string rawName = row["TABLE_NAME"].ToString(); // 例如 "Sheet1$" 或 "'Sheet 2'$"
            // 有效工作表名稱特徵:包含 $ 且去除單引號後以 $ 結尾
            string cleaned = rawName.Replace("'", "");
            if (cleaned.Contains("$") && cleaned.EndsWith("$"))
            {
                // 移除尾端 $ 取得真實工作表名稱
                list.Add(cleaned.Substring(0, cleaned.Length - 1));
            }
        }
        return list.ToArray();
    }
}

關鍵過濾邏輯說明

  • TABLE_NAME 可能值:Sheet1$、'Sheet 2'$、_FilterDatabase (自動篩選)、Print_Titles (列印標題) 等系統命名區域。
  • 過濾條件 Contains("$") && EndsWith("$") 可有效排除系統物件,僅保留真實工作表。
  • 去除單引號是因為名稱含空格時會被單引號包裹。

呼叫範例

string file = @"C:\Data\Report.xlsx";
string[] sheets = GetExcelSheetNames(file);
foreach (var s in sheets)
    Console.WriteLine($"工作表: {s}");
// 輸出範例:
// 工作表: Sheet1
// 工作表: Sales Data
// 工作表: Summary

替代方案:NPOI (無需安裝 Access Engine)

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;

public string[] GetSheetNamesNPOI(string filePath)
{
    using (var fs = File.OpenRead(filePath))
    {
        IWorkbook wb = Path.GetExtension(filePath).ToLower() == ".xls"
            ? new HSSFWorkbook(fs)
            : new XSSFWorkbook(fs);
        return Enumerable.Range(0, wb.NumberOfSheets)
                         .Select(i => wb.GetSheetAt(i).SheetName)
                         .ToArray();
    }
}

NPOI 純 managed、跨平台、無相依性,建議新專案優先採用。

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45597.htm

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved