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

Excel 匯入 DataSet 通用方法 (OLEDB Provider)

     編輯:關於.NET

適用場景

快速將 Excel 檔案 (.xls / .xlsx) 匯入 DataSet,適合離線資料處理、報表匯入、批次匯入前驗證等場景。

完整方法實作

public static DataSet ExcelToDataSet(string filePath, string sheetName)
{
    var ds = new DataSet();

    try
    {
        // 建立 OLEDB 連線字串 (支援 .xls 與 .xlsx)
        string connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filePath};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'";
        // 注意:.xls 舊格式請用 Microsoft.Jet.OLEDB.4.0 / Excel 8.0

        using (var conn = new OleDbConnection(connStr))
        {
            conn.Open();
            string query = $"SELECT * FROM [{sheetName}$]"; // 工作表名稱需加 $ 符號

            using (var adapter = new OleDbDataAdapter(query, conn))
            {
                adapter.Fill(ds, sheetName);
            }
        }
    }
    catch (Exception ex)
    {
        // 實務建議:記錄日誌而非直接 MessageBox
        System.Windows.Forms.MessageBox.Show($"Excel 匯入失敗: {ex.Message}");
    }

    return ds;
}

關鍵參數說明

參數說明
ProviderMicrosoft.ACE.OLEDB.12.0 支援 .xlsx/.xls;Microsoft.Jet.OLEDB.4.0 僅支援 .xls (32-bit 限制)
Extended PropertiesExcel 12.0 Xml 對應 .xlsx;Excel 8.0 對應 .xls
HDR=YES第一列視為標題欄位名;HDR=NO 則以 F1, F2... 命名
IMEX=1混合資料類型欄位強制以文字讀取,避免數值/日期格式衝突導致空值
[{sheetName}$]工作表名稱必須加 $ 結尾;若名稱含空格請用單引號包裹 '[Sheet 1$]'

常見問題與解決

  1. 「未註冊提供者」錯誤:安裝 Microsoft Access Database Engine 2010 Redistributable (x64 版供 64-bit 應用)。
  2. 64-bit 應用無法使用 Jet OLEDB:改用 ACE Provider 或將專案設為 Prefer 32-bit。
  3. 工作表名稱動態取得:conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null) 列出所有工作表。
  4. 大量資料效能:考慮 SqlBulkCopy 直接寫入 SQL Server,或使用 EPPlus/NPOI 免 OLEDB 解析。

進階替代方案 (無 OLEDB 相依)

  • NPOI:純 .NET 讀寫 .xls/.xlsx,跨平台、無驅動程式相依。
  • EPPlus:功能豐富的 .xlsx 專用庫,支援樣式、公式、資料驗證。
  • ClosedXML:語法直覺的 OpenXML 封裝,適合 .NET Core/5+ 專案。

程式碼備註

原始範例使用 Microsoft.Jet.OLEDB.4.0 與 Excel 8.0,僅相容 .xls 格式。現代專案建議改用 ACE Provider 統一處理新舊格式,並加入 IMEX=1 避免型別推斷問題。

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