| 環境 | Office 版本 | ACE Provider 版本 | 結果 |
| 64 位 Windows + 64 位進程 | 32 位 Office | 32 位 ACE.OLEDB.12.0 | ❌ 找不到 Provider(64 位進程無法加載 32 位 COM 組件) |
| 64 位 Windows + 32 位進程 | 32 位 Office | 32 位 ACE.OLEDB.12.0 | ✅ 正常 |
| 64 位 Windows + 64 位進程 | 64 位 Office | 64 位 ACE.OLEDB.12.0 | ✅ 正常 |
| 32 位 Windows + 32 位進程 | 32 位 Office | 32 位 ACE.OLEDB.12.0 | ✅ 正常 |
結論:進程位數必須與 ACE Provider 位數一致。最常見場景是 64 位系統裝 32 位 Office,導致 ACE 只有 32 位版本,C# 默認 64 位進程無法加載。
驗證步驟:確認已安裝的 Provider
- 打開註冊表編輯器
regedit。
- 查路徑:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.ACE.OLEDB.12.0(64 位視圖)
- 查路徑:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\Microsoft.ACE.OLEDB.12.0(32 位視圖)
- 若只有 WOW6432Node 下有,說明只裝了 32 位 Provider。
或用 PowerShell 快速檢查:
Get-ItemProperty HKLM:\SOFTWARE\Classes\Microsoft.ACE.OLEDB.12.0 -ErrorAction SilentlyContinue
Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Classes\Microsoft.ACE.OLEDB.12.0 -ErrorAction SilentlyContinue
徹底解決方案:強制編譯為 x86 (32 位)
Visual Studio 2019/2022 圖形界面操作
- 右鍵專案 → Properties (屬性)。
- 左側選 Build (生成) 標籤。
- 取消勾選 Prefer 32-bit (優先 32 位) —— 注意:.NET Framework 專案此選項無效,見下文。
- 勾選 Platform target (目標平台) → 選 x86。
- 確保 Prefer 32-bit 未勾選(若灰色不可改則忽略)。
.NET Framework 專案(非 .NET Core/5+)必須手動選 x86
Prefer 32-bit 僅對 .NET Core / .NET 5+ 生效。對 .NET Framework 專案,必須在 Platform target 明確選 x86,不能選 Any CPU。
命令行 / CI/CD 設置
# MSBuild
msbuild MyProject.csproj /p:PlatformTarget=x86
# dotnet build (.NET Core/5+)
dotnet build -p:PlatformTarget=x86
# 發布獨立 32 位可執行文件
dotnet publish -r win-x86 --self-contained true
連接字符串標準寫法
// .xlsx (Excel 2007+)
string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';";
// .xls (Excel 97-2003)
string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
// 使用示例
string filePath = @"D:\Data\Report.xlsx";
using (var conn = new OleDbConnection(string.Format(connStr, filePath))) {
conn.Open();
var schema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
foreach (DataRow row in schema.Rows) {
string sheet = row["TABLE_NAME"].ToString();
using (var cmd = new OleDbCommand($"SELECT * FROM [{sheet}]", conn))
using (var adapter = new OleDbDataAdapter(cmd)) {
var dt = new DataTable();
adapter.Fill(dt);
// 處理數據...
}
}
}
ACE Provider 安裝包獲取與安裝順序
- 下載 Microsoft Access Database Engine 2010 Redistributable:
- 32 位:
AccessDatabaseEngine.exe(約 25MB)
- 64 位:
AccessDatabaseEngine_X64.exe(約 30MB)
- 安裝順序關鍵:先卸載舊版 Office/ACE → 安裝目標位數 ACE → 再安裝 Office(若需)。不可在已有 64 位 Office 的機器上安裝 32 位 ACE(會報錯),反之亦然。
- 若必須共存:使用
/passive 靜默安裝,或解壓 MSI 手動註冊(不推薦生產環境)。
替代方案:免安裝 ACE 的純 .NET 庫
| 庫 | NuGet 包 | 特點 | 適用場景 |
| EPPlus | EPPlus | 功能豐富、支援 .xlsx、無 COM 依賴、LGPL/商業授權 | 服務器端、容器化、無 Office 環境 |
| NPOI | NPOI | Apache POI 移植、支援 .xls/.xlsx、免費開源 | 跨平台、Linux Docker、舊版 .xls |
| ClosedXML | ClosedXML | API 友好、基於 OpenXML SDK、MIT 授權 | 現代 .NET 專案、純代碼操作 |
| OpenXML SDK | DocumentFormat.OpenXml | 微軟官方、底層 XML 操作、學習曲線陡 | 極致效能、複雜報表生成 |
推薦:新專案優先用 EPPlus 或 ClosedXML,徹底擺脫 ACE Provider 位數地獄。
避坑檢查單
- [ ] 目標平台是否設為 x86?
- [ ] 是否安裝了與進程位數匹配的 ACE Provider?
- [ ] 連接字符串
Extended Properties 是否正確(Excel 12.0 Xml 對應 .xlsx)?
- [ ] 文件路徑是否包含中文/特殊字符?嘗試
@\"D:\\Data\\報表.xlsx\" 或 Path.GetFullPath。
- [ ] 文件是否被 Excel 佔用(只讀模式打開)?關閉 Excel 再運行。
- [ ] IIS 部署時:應用程序池 啟用 32 位應用程序 = True。
總結
C# 讀取 Excel 2010 報「未註冊 ACE.OLEDB.12.0」,90% 是進程位數與 Provider 位數不匹配。將專案目標平台強制設為 x86 是最快、最穩定的修復。長期來看,遷移至 EPPlus/ClosedXML/NPOI 等純 .NET 庫可徹底消除 COM 組件依賴,支援 Linux 容器化部署,是現代化技術棧選型。
- 上一篇文章: James 郵件服務器內網能收發、外網能收不能發:Relay Denied 根因與 DNS 解析修復實戰
- 下一篇文章: 移動硬盤誤初始化+格式化數據恢復指南:分區表重建、文件系統修復與專業數據恢復機構選擇
Copyright ©
程式碼之家 All Rights Reserved