通过Visual Studio C#中的代码打开Word文档

时间:2011-06-30 18:10:53

标签: c# .net vsto

我正在使用Visual Studio开发Office Development。并收到以下错误

Error: 
**
Unable to cast COM object of type 'Microsoft.Office.Interop.Word.ApplicationClass' to interface type 'Microsoft.Office.Interop.Word._Application'. 
This operation failed because the QueryInterface call on the COM component for the interface with IID '{00020970-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
**

代码:(也在https://gist.github.com/1056809

if (File.Exists((string)strDocPath))
{
    Word.Application wdApp = new Word.Application();
    wdApp.Visible = true; //Error thrown here

    object readOnly = false;
    object isVisible = true;
    object oMissing = System.Reflection.Missing.Value;

    //Open the word document
    //Error thrown on line below.
    Word.Document aDoc = wdApp.Documents.Open(ref strDocPath, ref oMissing, ref readOnly, ref oMissing, ref oMissing, ref oMissing,
                                              ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref isVisible,
                                              ref oMissing, ref oMissing, ref oMissing, ref oMissing); 


    // Activate the document
    aDoc.Activate();
}

这是什么错误?我怎么能避免呢?

3 个答案:

答案 0 :(得分:2)

问题是HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID {000209FF-0000-0000-C000-000000000046}无法注册。 虽然您的注册表中存在类(Microsoft.Office.Interop.Word.ApplicationClass),但并不意味着它已经注册。 Microsoft不允许出于某些无法解释的原因注册Microsoft.Office.Interop.Word.dll,因此,如果您在代码中引用“ApplicationClass”类;部署到实际服务器时,您会遇到此问题。您不会在本地/构建计算机上收到错误消息/警告。 这是通用错误的样子:

  

使用CLSID检索组件的COM类工厂   {000209FF-0000-0000-C000-000000000046}由于以下原因而失败   错误:80040154未注册类(HRESULT异常:   0x80040154(REGDB_E_CLASSNOTREG))。

结论: 即使您安装/激活了Microsoft Office 2007/2010&领有牌照。无法注册“Microsoft.Office.Interop.Word.dll”DLL。我花了差不多整整一个星期来解决这个问题。注意:亲眼看看;下载 - 安装 - 运行“RegDllView”。您可以看到“WINWORD.EXE”的所有已注册的DLL。请注意,不会显示{000209FF-0000-0000-C000-000000000046}。尝试使用该程序手动注册“Microsoft.Office.Interop.Word.dll”将失败,错误代码为127.我认为解决方法实际上是在Microsoft.Office中使用提供的“Document”接口。 Interop.Word.dll。它只是WINWORD的一个包装器.EXE就是它的归纳。

答案 1 :(得分:1)

尝试用if语句替换if语句之后的第一行:

Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();

然后确保添加对“Microsoft Word 12.0对象库”COM对象的引用,该对象在解决方案资源管理器中看起来像“Microsoft.Office.Interop.Word”。

我对此进行了测试,并出现了一个空白的MS Word应用程序。所以,让我们看看我们是否可以做到这一点。

答案 2 :(得分:0)

我知道这有点“逾期”,但是有些人可能仍然难以找到一个简单的解决方案(就像我自己一样),因此我的答复是这样。

根据@Marine_Elite帖子,该类未正确注册,但是有一种解决方法(我认为)比在 WINWORD.EXE 上编写自定义包装要容易得多。

我已经使用了here中的示例,并将其应用于了 MSWORD.OLB
简而言之,您可能只需要下载regtlibv12.exe并针对上述OLB运行它,但是强烈建议您按照提供的链接中的所有步骤进行操作。

我使用的finall命令是:
regtlibv12.exe "C:\Program Files\Microsoft Office\root\Office16\MSWORD.OLB"

自那时以来,我的代码运行得很好,尽管我不确定重启后应用程序在其他主机上甚至在我自己的计算机上的行为。在后一种情况下,再次注册OLB可能会带来问题,但这是一个简单的解决方案。