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

ADO.NET 讀取 Excel 核心技巧:從基礎連接到動態架構自動匯入

     編輯:更多程式設計知識

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();

四大關鍵注意事項

  1. Excel 版本對應:Excel 8.0 覆蓋 97/2000/2002/2003;5.0 適用 95;4.0/3.0 依版本
  2. 物理絕對路徑:Server.MapPath 取得,相對路徑會失敗
  3. 表引用三要素:方括號 [] + 美元符號 $ + 正確名稱/範圍
  4. 首列處理:HDR=YES(預設)首列為欄名;HDR=NO 全部 F1、F2…

混合型別欄位救星:IMEX=1

預設驅動程式掃描前 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...
}

ADO.NET 版本演進

  • 1.x:唯有 OleDbConnection.GetOleDbSchemaTable
  • 2.0+:所有 DbConnection 實作統一 GetSchema(),SQL Server 可查 INFORMATION_SCHEMA.COLUMNS

實戰提醒

  • Excel 非資料庫,大量寫入/併發/格式控制請改用 Open XML SDK、EPPlus、NPOI
  • ACE Provider (Microsoft.ACE.OLEDB.12.0) 支援 .xlsx,需安裝 Access Database Engine
  • Web 伺服器部署務必安裝對應 OLE DB Provider 並設定應用程式池 32 位元模式(舊版 Jet 僅 32 位)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved