IIS中使用Microsoft.Office.Interop.Excel
異常1:
檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時失 敗,原因是出現以下錯誤: 80080005。
解決方案:
A、 檢查IIS發布的網站上的用戶組是否有Administrators用戶權限
B、 配置COM組件,用win+r命令打開命令運行窗口,輸入Dcomcnfg命令,進入組件服務配置界面,找到“Microsoft Excel Application”,配置“安全”和“標識”:
三個都要選擇自定義,並配置成everyone,如下操作:
配置“標識”,選擇“下列用戶”,配置成Administrator用戶,密碼為該用戶的登錄密碼:
異常2:
RPC 服務器不可用。 (異常來自 HRESULT:0x800706BA)
解決方案:
下面的代碼在有些版本的Windows系統是不會拋出異常:
Excel.Application excleApp = new Excel.Application(); Excel.Workbook workbook = excleApp.Workbooks.Open(reportFilePath); try {
//... } catch (Exception ex) { throw new Exception(ex.Message); } finally { workbook.Save(); //資源清理 excleApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(excleApp); GC.Collect(); }
但是有些Windows版本就會有問題:
會拋出
RPC 服務器不可用。 (異常來自 HRESULT:0x800706BA) 的異常。
查看有問題的Windows 版本的資源管理器會發現:
不管調用Excel.Application excleApp = new Excel.Application()多少次; 都只產生一個EXCEl.ExE進程。
而在不拋出異常的Windows版本上,每調用Excel.Application excleApp = new Excel.Application()一次; 就會產生一個新EXCEl.ExE進程。
如下代碼則可以正常運行:
Excel.Application excleApp = new Excel.Application(); Excel.Workbook workbook = excleApp.Workbooks.Open(reportFilePath); try { WriteExcelReportForSaleProductCashFlow(workbook, createReportParams); WriteExcelReportForSubjectLv2(excleApp,workbook, createReportParams); WriteForOwnCashFlowReport(workbook, createReportParams.ProjectSolutionId); } catch (Exception ex) { throw new Exception(ex.Message); } finally { workbook.Save(); //資源清理 //excleApp.Quit(); //System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); //System.Runtime.InteropServices.Marshal.ReleaseComObject(excleApp); GC.Collect(); }
將代碼
excleApp.Quit();
注釋掉就不會拋出異常:RPC 服務器不可用。 (異常來自 HRESULT:0x800706BA) 的異常。