IIS中使用Microsoft.Office.Interop.Excel安全
異常1:服務器
檢索 COM 類工廠中 CLSID 爲 {00024500-0000-0000-C000-000000000046} 的組件時失 敗,緣由是出現如下錯誤: 80080005。
解決方案:網站
A、 檢查IIS發佈的網站上的用戶組是否有Administrators用戶權限ui
B、 配置COM組件,用win+r命令打開命令運行窗口,輸入Dcomcnfg命令,進入組件服務配置界面,找到「Microsoft Excel Application」,配置「安全」和「標識」:spa
三個都要選擇自定義,並配置成everyone,以下操做:3d
配置「標識」,選擇「下列用戶」,配置成Administrator用戶,密碼爲該用戶的登陸密碼:code
異常2:blog
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) 的異常。