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

C# 讀取 Excel 2010 「未註冊 Microsoft.ACE.OLEDB.12.0」徹底解決:目標平台 x86 強制 32 位模式

     編輯:程式設計綜合問答

經典 C# 讀取 Excel (.xlsx) 報錯:System.InvalidOperationException: The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. 本文從根因分析、驗證步驟、徹底解決方案、避坑指南四個維度給出標準化處理流程。

根因:位數不匹配

結論:進程位數必須與 ACE Provider 位數一致。最常見場景是 64 位系統裝 32 位 Office,導致 ACE 只有 32 位版本,C# 默認 64 位進程無法加載。

驗證步驟:確認已安裝的 Provider

  1. 打開註冊表編輯器 regedit。
  2. 查路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.ACE.OLEDB.12.0(64 位視圖)
  3. 查路徑:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\Microsoft.ACE.OLEDB.12.0(32 位視圖)
  4. 若只有 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 圖形界面操作

  1. 右鍵專案 → Properties (屬性)。
  2. 左側選 Build (生成) 標籤。
  3. 取消勾選 Prefer 32-bit (優先 32 位) —— 注意:.NET Framework 專案此選項無效,見下文。
  4. 勾選 Platform target (目標平台) → 選 x86。
  5. 確保 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 安裝包獲取與安裝順序

  1. 下載 Microsoft Access Database Engine 2010 Redistributable:
    • 32 位:AccessDatabaseEngine.exe(約 25MB)
    • 64 位:AccessDatabaseEngine_X64.exe(約 30MB)
  2. 安裝順序關鍵:先卸載舊版 Office/ACE → 安裝目標位數 ACE → 再安裝 Office(若需)。不可在已有 64 位 Office 的機器上安裝 32 位 ACE(會報錯),反之亦然。
  3. 若必須共存:使用 /passive 靜默安裝,或解壓 MSI 手動註冊(不推薦生產環境)。

替代方案:免安裝 ACE 的純 .NET 庫

環境Office 版本ACE Provider 版本結果
64 位 Windows + 64 位進程32 位 Office32 位 ACE.OLEDB.12.0❌ 找不到 Provider(64 位進程無法加載 32 位 COM 組件)
64 位 Windows + 32 位進程32 位 Office32 位 ACE.OLEDB.12.0✅ 正常
64 位 Windows + 64 位進程64 位 Office64 位 ACE.OLEDB.12.0✅ 正常
32 位 Windows + 32 位進程32 位 Office32 位 ACE.OLEDB.12.0✅ 正常

推薦:新專案優先用 EPPlus 或 ClosedXML,徹底擺脫 ACE Provider 位數地獄。

避坑檢查單

  1. [ ] 目標平台是否設為 x86?
  2. [ ] 是否安裝了與進程位數匹配的 ACE Provider?
  3. [ ] 連接字符串 Extended Properties 是否正確(Excel 12.0 Xml 對應 .xlsx)?
  4. [ ] 文件路徑是否包含中文/特殊字符?嘗試 @\"D:\\Data\\報表.xlsx\" 或 Path.GetFullPath。
  5. [ ] 文件是否被 Excel 佔用(只讀模式打開)?關閉 Excel 再運行。
  6. [ ] IIS 部署時:應用程序池 啟用 32 位應用程序 = True。

總結

C# 讀取 Excel 2010 報「未註冊 ACE.OLEDB.12.0」,90% 是進程位數與 Provider 位數不匹配。將專案目標平台強制設為 x86 是最快、最穩定的修復。長期來看,遷移至 EPPlus/ClosedXML/NPOI 等純 .NET 庫可徹底消除 COM 組件依賴,支援 Linux 容器化部署,是現代化技術棧選型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
庫NuGet 包特點適用場景
EPPlusEPPlus功能豐富、支援 .xlsx、無 COM 依賴、LGPL/商業授權服務器端、容器化、無 Office 環境
NPOINPOIApache POI 移植、支援 .xls/.xlsx、免費開源跨平台、Linux Docker、舊版 .xls
ClosedXMLClosedXMLAPI 友好、基於 OpenXML SDK、MIT 授權現代 .NET 專案、純代碼操作
OpenXML SDKDocumentFormat.OpenXml微軟官方、底層 XML 操作、學習曲線陡極致效能、複雜報表生成