我是在本地32位操作系統+vs2010+office2007做創建並下載Excel,ppt文件的操作沒有問題,發布到64位系統的服務器上報錯,最開始報錯::
1:Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B} failed due to the following error: 80040154 沒有注冊類 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
最開始想到的原因,我的服務器有好幾個虛機,其中有好使的,這個不好使難道是因為Excel和ppt是單獨安裝的,office裝的不全,組件沒注冊上?
在網上(http://support.microsoft.com/kb/828550/zh-cn)查到CLSID 為{91493441-5A91-11CF-8700-00AA0060263B}的組件是office的這個服務owerPoint.Application ,我想既然報錯沒注冊,那就注冊吧,在網上找的資料都說要通過C:WindowsSysWOW64 regsvr32注冊組件,費了很大的勁也沒弄明白要注冊哪個dll,最后卸載office,重新安裝,報錯
(2):Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B} failed due to the following error: 80070005 拒絕訪問。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
再接着在網上查資料,說卸載的不干凈,要把注冊表也刪除,好吧,再接再厲重新安裝,還是報(2)錯,想着是拒絕訪問,那是缺少權限啊,根據網上的各種配置權限,還是報錯,改變方向,網上(http://edu.cnzz.cn/200810/6270283a.shtml)找到原因可能是在Windows Server 2008 X64中通過.NET程序調用32位com組件的問題,按照其說的,在Visual Studio中,將編譯的目標平台(Platform target)設置為:X86,然后重新統計發布項目,錯誤依舊。
最后終於發現問題,DCOM配置中一直配置的是【Microsoft Office PowerPoint 預覽器】 原來一直都配置錯地方了,可是DCOM中也沒有【Microsoft Office PowerPoint 幻燈片】啊,原來服務器是64位了,沒有加載32位的組件,運行中敲入mmc -32,在控制台中‘文件’‘添加/刪除管理單元’選擇‘組件服務’添加,就會出現【Microsoft Office PowerPoint 幻燈片】,再把一些權限配置上就搞定了。
總結如下:.net調用office組件進行Excel、Word、ppt的一些操作,需要做一下操作:
1、正確全面的安裝office
2、DCOM配置權限(64位系統要添加32位組件【mmc -32】)
(1.) 開始-運行-dcomcnfg,啟動組件服務。
(2.) 找到Microsoft Excel Application、Microsoft Office PowerPoint 幻燈片、Microsoft Office Word 97 - 2003 文檔,-屬性 -安全-中所有配置都選擇“自定義”,添加用戶(SYSTEM、INTERACTIVE、Everyone、Administrators、Administrator、IIS-IUSRS()、Network Services、Network 、USERS),添加“啟動和激活權限”、“訪問權限”,並賦予本地啟動和激活;-標識,交互式用戶(不能選擇啟動用戶,會無法結束進程)
下面是一些網上的解決辦法:
1、以下引自:http://edu.cnzz.cn/200810/6270283a.shtml
在開發短信接口時,需要調用一個com組件,在本機測試成功。可是部署到Windows Server 2008 X64的服務器上卻出現下面的錯誤:
Retrieving the COM class factory for component with CLSID {79AD7B73-C515-40B4-8B02-CB0F5FA5A1A} failed due to the following error: 80070005
部署時,直接在命令行中通過regsvr32注冊com組件。
被這個問題折騰了幾個小時,終於找到原因和解決方法。
服務器用的是64-bit的系統,而.NET程序在本機編譯時,目標平始選的是Any CPU,這樣.NET程序在服務器上會運行於64位環境。
在相關資料中查到, 在64bit的環境中無法訪問32位的com組件。
所以只要讓.NET程序以32位的方式運行,就能解決問題。
解決方法:
1、通過C:WindowsSysWOW64regsvr32注冊組件。
2、在Visual Studio中,將編譯的目標平台(Platform target)設置為:X86,然后重新統計項目
2、以下引自:http://www.cnblogs.com/anshangcun/archive/2007/10/24/908101.html
最近因為項目的需要寫了一個應用,目的是在B/S架構下實現數據從Excel文檔中載入到數據庫。在本地開發的時候一切正常,當部署到測試環境下運行的時候出現如下的錯誤:“檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時失敗,原因是出現以下錯誤: 80070005”。
這是最簡單的一種問題,我一看這個錯誤就知道是屬於組件配置的范疇,可是我沒有想到這個問題解決了以后更讓我郁悶的事情還在后面。
先說一下“錯誤80070005”怎么解決(前提是Office2007必須正確安裝),解決的辦法很簡單,就是改配置,在命令行中輸入dcomcnfg.exe,在“組件服務-我的電腦-找到Microsoft Excel應用程序(在某些版本下會顯示Microsoft Excel Application)這一項對其進行配置,步驟如下:
1. 以管理員身份登錄到計算機,並使用完整安裝來安裝(或重新安裝)Office。為了實現系統的可靠性,建議您將 Office CD-ROM 中的內容復制到本地驅動器並從此位置安裝 Office。
2. 啟動要自動運行的 Office 應用程序。這會強制該應用程序進行自我注冊。
3. 單擊安全選項卡。驗證使用默認的訪問權限和使用默認的啟動權限已選中。
4. 單擊確定,關閉屬性對話框並返回主應用程序列表對話框。
5. 在 DCOM 配置對話框中,單擊默認安全性選項卡。
6. 單擊訪問權限的編輯默認值。驗證訪問權限中是否列出下列用戶,如果沒有列出,則添加這些用戶:
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_<machinename>*
IWAM_<machinename>*
Network Services
ASPNET
* 這些帳戶僅在計算機上安裝了 Internet Information Server (IIS) 的情況下才存在。
7. 確保允許每個用戶訪問,然后單擊確定。
8. 單擊啟動權限的編輯默認值。驗證啟動權限中是否列出下列用戶,如果沒有列出,則添加這些用戶:
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_<machinename>*
IWAM_<machinename>*
Network Services
ASPNET
* 這些帳戶僅在計算機上安裝有 IIS 的情況下才存在。
9. 確保允許每個用戶訪問,然后單擊確定。
10. 單擊確定關閉 DCOMCNFG。
這樣配置一番以后再運行OK,於是我的心情很晴朗(我行,我不是一般人)。可是過了一段時候,產品組又說Excel的數據載入功能又不能用了,我運行一番竟然還是這個錯誤“檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時失敗,原因是出現以下錯誤: 80070005”。我打開DCOM配置查看,發現和我上一回的配置是完全一樣的沒有做任何改動,可是運行還是會出現這個錯誤,我就郁悶了。於是我到網上遍查資料,結果沒有一個可以用的,他們出現的問題,都是我曾經解決過的。
於是在DCOM中我打開Microsoft Excel Application重新進行設置,在“標識”標簽里選擇“下列用戶”進行運行。因為我聽說這台服務器已經加入域,並且域名是Nanjing.com.cn,於是我就嘗試使用nanjing"administrator來運行。
關機,重啟,重新運行程序,80070005這個錯誤終於不出現了,可是出現了一個更要命的錯誤。“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 對象強制轉換為接口類型“Microsoft.Office.Interop.Excel._Application”。此操作失敗的原因是對 IID 為“{000208D5-0000-0000-C000-000000000046}”的接口的 COM 組件調用 QueryInterface 因以下錯誤而失敗: 加載類型庫/DLL 時出錯。 (異常來自HRESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。
如果是出現這種錯誤就很可能是我的組件有問題,要知道那是一個超級復雜的組件,類圖就用了很多篇幅。我打開代碼仔細的檢查,在別人的環境上運行,還是沒有問題,我把代碼全部屏蔽,只留了一條調用Excel組件的語句,又運行還是報這個錯誤。
最后只能重新安裝Office組件,再試成功了。
當出現類似問題的時候,
1,檢查Office組件安裝成功否。
2,如果是在B/S構架下進行訪問請先給Office組件分配合理的權限(Network Services),如果在域環境下還要考慮域權限。
3,要有自信,找出問題的原因,如果懷疑是自己的代碼,可以只留幾條調用Excel組件的語句,如果還是報錯那肯定就是環境問題。
4,我使用的名字空間是Microsoft.Office.Interop.Excel;
3、以下引自:http://www.cnblogs.com/Tiffany_2008/archive/2010/12/22/1914160.html
今日用到WordToHtml的方法,需要添加對office組件的引用(Microsoft.Office.Interop.Word)
程序集Microsoft.Office.Interop.Word
D:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Word.dll
調用代碼如下
using Microsoft.Office.Interop.Word;
ApplicationClass word = new ApplicationClass();
Type wordType = word.GetType();
Documents docs = word.Documents;
//打開文件
Type docsType = docs.GetType();
Document doc = (Document)docsType.InvokeMember("Open",
System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { wordFilePath, true, true });
//轉換格式,另存為
Type docType = doc.GetType();
docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
null, doc, new object[] { htmlFileUrl, WdSaveFormat.wdFormatFilteredHTML });
docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod,
null, doc, null);
//退出 Word
wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,
null, word, null);
原理顯而易見:通過程序啟動Word.exe程序,將本地文件打開,做另存為html操作,關閉word文檔,退出word程序
程序執行完成后存在兩個文件,原有word文件和html文件
本地調試沒有任何問題,Windows2003+Vs2008+IIS6.0+Office2007
發布網站,在本機IIS上配置好網站后(讀取寫入的權限都打鈎),登陸上傳word文件轉換出錯,錯誤異常消息如下:
檢索 COM 類工廠中 CLSID 為{00024500-0000-0000-C000-000000000046} 的組件時失敗,原因是出現以下錯誤: 80070005。
從網上搜帖子答案大致相同:登陸網站的用戶沒有操作word.exe的權限
好,運行"中輸入dcomcnfg.exe啟動"組件服務",也可以從管理工具里面進,
"組件服務"- >"計算機"- >"我的電腦"- >"DCOM配置"->找到word->屬性->"標識"標簽,選擇"交互式用戶"
->安全"標簽"->在"啟動和激活權限"上點擊"自定義",然后點擊對應的"編輯"按鈕,在彈出的"安全性"對話框中填加 一個"NETWORK SERVICE"用戶(注意要選擇本計算機名),並給它賦予"本地啟動"和"本地激活"權限.
->"安全"標簽,在"訪問權限"上點擊"自定義",然后點擊"編輯",在彈出的"安全性"對話框中也填加一個"NETWORK SERVICE"用戶,然后賦予"本地訪問"權限. 這樣,我們便配置好了相應的Excel的DCOM權限.
重啟本地機器上的IIS,未重啟機器,打開網站測試,OK了,順便提一下,操作的word文件和html文件夾要有讀寫的權限才行,右鍵--安全--Everyone或網絡服務用戶-->讀寫權限打鈎
接下來,發布到服務器上,外網登陸測試,拋黃頁,提示運行時錯誤 由於不是本地機器的登錄用戶所以不提示具體的錯誤信息。
得,從服務器的IIS里面瀏覽測試,拋出與我機器上同樣的錯誤,吼吼太好了,這下我可以練練手配置一下Dcom權限了,打開組件服務傻眼了
服務器上Windows2008+IIS7.0,在Dcom配置里面沒有找到word,看看安裝了Office沒有,結果是安裝了,Office2007,再搜搜帖子windows2008 的,
找了幾個帖子無果,看到了xp的組件服務配置,跟winserver2008的差不多,就這個吧
"組件服務"- >"計算機"- >"我的電腦"- >屬性-->Com組件->啟動和激活權限設置同上->訪問權限編輯同上->都添加了Network service用戶給用戶賦予相應的讀寫權限
重啟IIS了,盼望着盼望着,測試仍然是相同的錯誤 ,重啟服務器,the same result! 我靠
難道用戶添加錯了嗎?難道是AspNet用戶嗎,可是帖子上說window2000操作系統是這個用戶,IIS5.0是添加這個用戶,可是服務器上是windows2008+iis7.0 ,哎,試試吧
繼續修改重啟,仍然無果
網上仍然有招:盡管我還沒有試,先貼上再說
在web.config中使用身份模擬,在<system.web>節中加入 <identity impersonate="true" userName="你的用戶名" password="密碼"/></system.web>
我一直在想,為什么在服務器上DCom配置里面,沒有找到Office word 以及Office家族,是不是安裝的Vs2008是框架版的沒有自動注冊Office的一系列組件呢
研究了一些com組件的注冊和office的注冊,理解了為什么之前說 *.dll(動態類庫)和*.exe 都是可執行文件了,網上也有解決的辦法是Excel的,貼出來:
注冊方法執行 開始----運行----輸入excel2003的安裝路徑,例如 "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" /regserver 注意/符號前面有一個空格,其中"C:\Program Files\Microsoft Office\OFFICE11\excel.exe" 是excel2003的安裝程序的路徑,參數regserver表示注冊的意思!
運行后,會啟動Office 2003的安裝程序,進行修復,重新注冊。
excel2007為默認的啟動程序的方法類同,可以執行 開始----運行----"D:\Program Files\Microsoft Office\Office12\excel.exe" /regserver
綜上所述,再遇到Excel導出、導入問題時,先考慮權限問題,再考慮office的版本環境!如此基本能夠解決這些問題了。
Good!Tomorrow I will have a try!
<--順便貼出某個帖子的樓主經驗:我也遇到過應用以上方法還是報錯的情況,我的環境是windows2003 + office2003+office2007,在測試服務器上都可以導出無任何問題!但是更新了正式環境就是報錯,權限都設置了還是報錯,因為我的測試服務器是默認office啟動的,所以我懷疑是office版本環境問題!於是我卸載了office2007,馬上測試ok了,但是重啟服務器后就產生了have not been Pre-compiled錯誤,導出頁面都無法打開了,於是我又重新安裝了office2007,頁面可以打開了,但是導出excel時又開始報錯!我又把所有的權限重新設置一遍,問題依舊!后來發現兩個服務器默認打開excel的程序不一樣,測試環境是默認office2003打開,正式環境是office2007打開,於是我在正式環境重新注冊office2003,使其同樣也是默認office2003打開程序,靠!問題終於解決了---->