ASP.NET 環境下利用 Microsoft.Jet.OLEDB.4.0 讀取 Excel,核心在於正確的連接字串、表引用語法、欄位名稱處理、混合型別欄位對策,以及進階的動態架構發現技術。
string xlsPath = Server.MapPath("~/App_Data/data.xls");
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Extended Properties='Excel 8.0;HDR=YES;IMEX=1';" +
"Data Source=" + xlsPath;
string sql = "SELECT * FROM [Sheet1$]";
DataSet ds = new DataSet();
new OleDbDataAdapter(sql, connStr).Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
Server.MapPath 取得,相對路徑會失敗HDR=YES(預設)首列為欄名;HDR=NO 全部 F1、F2…預設驅動程式掃描前 8 列推斷型別,導致文字被當數字讀成空值。Extended Properties 加入 IMEX=1 強制所有混合欄位視為文字,徹底解決資料遺失。
適用於「不知有幾個 Sheet、每個 Sheet 結構不同」的場景:
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Extended Properties='Excel 8.0;HDR=NO;IMEX=1';" +
"Data Source=" + xlsPath;
using (OleDbConnection conn = new OleDbConnection(connStr))
{
conn.Open();
// 1. 取得所有表(工作表+命名區域)
DataTable tblSchema = conn.GetOleDbSchemaTable(
OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
List tables = new List();
foreach (DataRow r in tblSchema.Rows)
tables.Add((string)r["TABLE_NAME"]);
// 2. 逐表填充 DataSet
OleDbDataAdapter da = new OleDbDataAdapter();
DataSet ds = new DataSet();
foreach (string t in tables)
{
da.SelectCommand = new OleDbCommand($"SELECT * FROM [{t}]", conn);
da.Fill(ds, t);
}
// 3. 取得特定表欄位結構
DataTable colSchema = conn.GetOleDbSchemaTable(
OleDbSchemaGuid.Columns, new object[] { null, null, "Sheet1$", null });
// 欄位:COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, ORDINAL_POSITION...
}
OleDbConnection.GetOleDbSchemaTableDbConnection 實作統一 GetSchema(),SQL Server 可查 INFORMATION_SCHEMA.COLUMNSMicrosoft.ACE.OLEDB.12.0) 支援 .xlsx,需安裝 Access Database Engine