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

C# 透過 OLEDB 取得 Excel/Access 結構描述 (Table/Column 清單)

     編輯:關於C語言

使用 `OleDbConnection.GetOleDbSchemaTable` 即可在不開啟工作表的情況下,取得 Excel/Access 的資料表、欄位、索引、主鍵等中繼資料。

連接字串


// Excel .xls (舊格式)
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";

// Excel .xlsx (新格式)
string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'";

// Access
string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";";

取得所有資料表名稱


using (var conn = new OleDbConnection(connStr))
{
    conn.Open();
    DataTable tables = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    foreach (DataRow row in tables.Rows)
        Console.WriteLine(row["TABLE_NAME"]); // Excel 會呈現 Sheet1$, Sheet2$ 等
}

取得指定資料表的欄位結構


DataTable columns = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tableName, null });
foreach (DataRow col in columns.Rows)
{
    Console.WriteLine($"欄位: {col["COLUMN_NAME"]}, 型別: {col["DATA_TYPE"]}, 長度: {col["CHARACTER_MAXIMUM_LENGTH"]}, 可否為空: {col["IS_NULLABLE"]}");
}

常用 SchemaGuid 列舉

Guid用途限制條件 (restrictions)
Tables資料表/工作表清單{Catalog, Schema, TableName, Type}
Columns欄位定義{Catalog, Schema, TableName, ColumnName}
Primary_Keys主鍵欄位{Catalog, Schema, TableName}
Indexes索引資訊{Catalog, Schema, IndexName, Type, TableName}
Foreign_Keys外鍵關聯{Catalog, Schema, FKTableName, PKTableName}
Procedures預存程序/查詢{Catalog, Schema, ProcedureName, Type}

完整主控台範例


class Program
{
    static void Main()
    {
        string path = @"C:\data.xlsx";
        string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'";

        using (var conn = new OleDbConnection(connStr))
        {
            conn.Open();
            var tables = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            foreach (DataRow t in tables.Rows)
            {
                string tn = t["TABLE_NAME"].ToString();
                Console.WriteLine($"=== {tn} ===");
                var cols = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tn, null });
                foreach (DataRow c in cols.Rows)
                    Console.WriteLine($"  {c["COLUMN_NAME"]} ({c["DATA_TYPE"]})");
            }
        }
        Console.ReadKey();
    }
}

注意事項

  • 驅動程式:需安裝對應的 Access Database Engine (32/64 位元需與應用程式一致)。
  • IMEX=1:混合資料型別欄位強制以文字讀取,避免數值欄位前幾列為數字後面出現文字導致讀取為 null。
  • HDR=YES:第一列為標題列;若無標題設 `HDR=NO`,欄位名將為 F1, F2...。
  • Excel 獨特限制:工作表名稱結尾帶 `$` (如 `Sheet1$`),查詢時需用 `[Sheet1$]`。
  • 唯讀鎖定:Excel 檔案被開啟時可能無法獨佔存取,建議先複製暫存檔再操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved