| Excel 版本 | 副檔名 | Provider | Extended Properties |
|---|---|---|---|
| Excel 2003 | .xls | Microsoft.Jet.OLEDB.4.0 | Excel 8.0;HDR=Yes;IMEX=1 |
| Excel 2007/2010/2013/2016/2019/365 | .xlsx/.xlsm/.xlsb | Microsoft.ACE.OLEDB.12.0 | Excel 12.0;HDR=Yes;IMEX=1 |
string fileExt = Path.GetExtension(excelPath).ToLower();
string connStr;
if (fileExt == ".xls")
{
connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelPath +
@";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
}
else // .xlsx, .xlsm, .xlsb
{
connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelPath +
@";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
}
| 參數 | 值 | 說明 |
|---|---|---|
| HDR | Yes / No | 第一列是否為標題列。Yes = 欄位名來自第一列;No = 自動產生 F1, F2...。 |
| IMEX | 0 / 1 / 2 | 混合資料類型匯入模式。0 = 僅匯出(預設)1 = **匯入混合模式**(掃描前 8 列決定型別,**建議讀取時必設 1**)2 = 匯出模式(連結模式) |
| Excel 8.0 / 12.0 | 版本標識 | 對應 Jet/ACE 引擎的 Excel 格式版本,不可任意修改。 |
64 位元 OS + 64 位元 Office/無 Office 環境,**必須安裝 64 位元 ACE 引擎**,否則會出現「未在本機電腦上註冊 'Microsoft.ACE.OLEDB.12.0' 提供者」錯誤。
Microsoft.ACE.OLEDB.12.0 **支援讀取 .xls 與 .xlsx**,若環境已裝 64 位元 ACE,可**統一使用 ACE 連接字串**簡化程式碼:
string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelPath +
@";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
測試確認可正常讀取 .xls 後,即可移除 Jet 判斷邏輯。
| 錯誤訊息 | 原因 | 解決 |
|---|---|---|
| 「未註冊 Provider」 | 缺少 ACE/Jet 引擎 | 安裝對應位元數的 Access Database Engine |
| 「外部資料表不是預期的格式」 | 副檔名與 Provider 不符(如 .xlsx 用 Jet) | 依副檔名選正確 Provider |
| 數值欄位讀出 NULL | 前 8 列為文字,後為數值,IMEX=0 | 設定 IMEX=1,或在登錄 TypeGuessRows=0 掃描全表 |
| 日期格式錯誤 | Excel 儲存為數值序號,轉換邏輯缺失 | 讀取後用 DateTime.FromOADate(doubleVal) 轉換 |
掌握「.xls → Jet 4.0、.xlsx → ACE 12.0、IMEX=1 讀取混合型別、ACE 64 位元必裝**」四大鐵律,即可在 C# 中穩健連接各版本 Excel。建議專案統一升級至 ACE 12.0(支援雙格式),並將連接字串封裝為工具方法,集中管理 Provider、路徑、參數,降低維運複雜度。