# 在 .NET 專案中使用 Microsoft.Office.Interop.Excel 的常見問題 最近加班忙翻了,最近才比較有空補之前的筆記 orz,但有點懶,就不截圖了。 許多政府單位在系統開發時,都會要求 Excel 匯出功能必須同時支援 ODS 格式。在 .NET 生態系統中,處理 ODS 的套件大多是付費的,就算有免費版本也會有功能限制。因此,常見的解決方案是先產生 Excel 檔案,再透過 Microsoft.Office.Interop.Excel 來讀取主機上的 Office Excel,將檔案另存成 ODS 格式。 不過這個做法在本機開發時可能運作正常,但部署到 Server 環境後就會碰到一些問題。以下列出一些我遇到的問題。 ## dotnet publish 編譯異常 因為 COM 元件的特性,這種處理方式只能在 Windows 環境底下使用。 Visual Studio 的發佈功能跟 `dotnet publish` 指令都是以 MSBuild 為基礎,不過它們用的執行環境可能不一樣,所以會造成行為跟輸出結果有些差異。Visual Studio 是使用安裝在 Visual Studio 裡面的 MSBuild,而 dotnet publish 則是用 .NET SDK 裡面附的 MSBuild 版本。再加上兩邊在專案設定跟參數處理上可能有差異,這就會導致在 Visual Studio 可以正常編譯,但用 dotnet publish 的時候卻會跳出以下錯誤: ``` error MSB4803: MSBuild 的 .NET Core 版本不支援工作 "ResolveComReference"。請使用 MSBuild 的 .NET Framework 版本。 ``` 這問題我沒找到解法,目前作法就是建立一個 .NET Framework 的 Web API。當系統需要轉換成 ODS 格式時,就呼叫這個專門的 API 服務來處理轉換工作並回傳結果。 ## 執行時的錯誤處理流程 ### 1. DCOM 元件權限不足 如果執行時遇到以下錯誤訊息: ``` System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 存取被拒。 (0x80070005 (E_ACCESSDENIED)). ``` 這表示需要設定 DCOM 權限: 在 Windows Server 環境中,COM 元件的存取是由 DCOM(Distributed COM)安全性機制管理的。為了讓 IIS 應用程式能夠控制 Excel,我們需要明確授予存取權限: 1. 開啟 DCOM 設定工具: * 按下 Windows + R。 * 輸入 dcomcnfg。 * 依序展開:元件服務 > 電腦 > 我的電腦 > DCOM 設定。 2. 設定 Microsoft Excel Application: * 在清單中尋找 "Microsoft Excel Application"。 * 點擊右鍵選擇「內容」。 * 切換到安全性頁籤。 * 在存取權限區塊中,點選「自訂」。 * 將 IIS APPPOOL\{應用程式集區名稱} 加入到使用者清單中。 * 設定存取權限: * localhost 連線:勾選本機存取。 * 外部 IP 連線:勾選遠端存取。 ### 2. Excel 檔案存取問題 當執行過程中,如果出現找不到 Excel 檔案的錯誤訊息,這是因為 Excel COM 元件在執行時會嘗試存取使用者的桌面路徑。在 Windows Server 環境中,系統服務帳戶預設沒有桌面資料夾,所以我們需要手動建立。 Desktop 資料夾的建立位置應該是看的 Microsoft Office 版本: * 32 位元 Office:`C:\Windows\SysWOW64\config\systemprofile\Desktop`。 * 64 位元 Office:`C:\Windows\System32\config\systemprofile\Desktop`。 ## 注意事項 1. 此設定僅適用於 Windows 環境。 2. 需要在伺服器上安裝 Microsoft Office。 3. 每次 Windows 更新後可能需要重新檢查權限設定。 ###### tags: `C#` `Excel`