使用 `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"]}");
}
| 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();
}
}