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

Posted

技术标签:

【中文标题】在 Visual Studio C# 中通过代码打开 Word 文档【英文标题】:Opening Word Document through code in Visual Studio C# 【发布时间】:2011-06-30 18:10:53 【问题描述】:

我正在使用 Visual Studio 进行 Office 开发。并收到下面的错误

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();

这是什么错误?我该如何避免呢?

【问题讨论】:

在我的情况下,这个答案是:***.com/questions/1006923/… gist.github.com/1056809 此链接无效。请检查 【参考方案1】:

问题是 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID000209FF-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 中提供的“文档”界面。互操作.Word.dll。它只是 WINWORD 的一个包装器。EXE 就是它的归根结底。

【讨论】:

using the provided "Document" interface with-in the Microsoft.Office.Interop.Word.dll 是什么意思?【参考方案2】:

尝试将 if 语句后的第一行替换为以下内容:

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

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

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

【讨论】:

您可以尝试使用这一行而不是代码中的第 3 行吗? 有一个错误是无法识别ApplicationClass。给出以下错误:无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。找不到类型或命名空间名称“ApplicationClass”(您是否缺少 using 指令或程序集引用?) 我想知道您是否没有引用正确的 COM 对象? 这对我导入 word 文档不起作用。还是谢谢【参考方案3】:

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

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

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

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

从那时起,我的代码运行得很好,尽管我不确定应用程序在不同的主机上甚至在我自己的机器上重新启动后会如何表现。不过,在后一种情况下可能出现的问题再次注册 OLB 是一个简单的解决方案。

【讨论】:

以上是关于在 Visual Studio C# 中通过代码打开 Word 文档的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中通过 C# (Selenium) 自动登录 Gmail

在 Visual Studio 中通过 C# 将参数传递给 Mac 上的终端

如何在 Visual Studio 2019 中通过单击按钮来重复数组上的元素

在 Visual Studio 中通过 printf() 打印 std::string

Android studio关于界面跳转问题

Visual Studio 2017:C# 突出显示并用括号括起来