在 .NET 專案中使用 Microsoft.Office.Interop.Excel 的常見問題
TLDR
dotnet publish不支援 COM 元件編譯,建議將轉換服務拆分為獨立的 .NET Framework Web API。- 執行時若出現
0x80070005錯誤,需透過dcomcnfg給予 IIS 應用程式集區帳戶 DCOM 存取權限。 - 若發生找不到檔案錯誤,需在系統目錄下手動建立
Desktop資料夾,以供 Office 元件存取。 - 此方案僅限 Windows 環境,且伺服器必須安裝 Microsoft Office。
在 .NET 專案中,若需將 Excel 轉換為 ODS 格式,常見做法是透過 Microsoft.Office.Interop.Excel 呼叫主機上的 Office 軟體進行另存新檔。此做法在開發環境運作正常,但在部署至 Server 時常會遇到編譯與權限問題。
dotnet publish 編譯異常
什麼情況下會遇到這個問題: 當專案使用 dotnet publish 指令進行發佈,且專案中引用了 COM 元件時。
由於 dotnet publish 使用的是 .NET SDK 內建的 MSBuild,其不支援 ResolveComReference 工作,導致編譯失敗並出現 error MSB4803。
解決建議: 由於此問題目前無直接解法,建議將 ODS 轉換功能抽離,建立一個獨立的 .NET Framework Web API 服務。當系統需要轉換格式時,透過呼叫該 API 進行處理,以避開 .NET Core/5+ 環境對 COM 元件的限制。
執行時的錯誤處理流程
1. DCOM 元件權限不足
什麼情況下會遇到這個問題: 當 IIS 應用程式嘗試啟動 Excel COM 物件,但應用程式集區(Application Pool)帳戶缺乏足夠的 DCOM 權限時,會拋出 0x80070005 (E_ACCESSDENIED) 錯誤。
解決步驟:
- 按下
Win + R並輸入dcomcnfg開啟元件服務。 - 依序展開:元件服務 > 電腦 > 我的電腦 > DCOM 設定。
- 找到 Microsoft Excel Application,點擊右鍵選擇「內容」。
- 切換至「安全性」頁籤,在「存取權限」區塊點選「自訂」。
- 將對應的
IIS APPPOOL\{應用程式集區名稱}加入使用者清單。 - 勾選「本機存取」與「遠端存取」權限。
2. Excel 檔案存取問題
什麼情況下會遇到這個問題: Excel COM 元件在執行時會嘗試存取使用者的 Desktop 資料夾,但 Windows Server 的系統服務帳戶預設並不存在此路徑。
解決步驟: 需根據安裝的 Office 位元版本,手動建立對應的 Desktop 資料夾:
- 32 位元 Office:
C:\Windows\SysWOW64\config\systemprofile\Desktop - 64 位元 Office:
C:\Windows\System32\config\systemprofile\Desktop
注意事項
- 此設定僅適用於 Windows 環境。
- 伺服器端必須安裝 Microsoft Office。
- 每次 Windows 更新後,建議重新檢查上述權限與目錄設定。
異動歷程
- 初版文件建立。