Interop.Word的Documents.Open为空。

24

我尝试使用Interop.Word.Application打开.docx文件并将其转换为PDF。它作为控制台应用程序工作正常,但如果我在我的Web应用程序中使用相同的代码,它就无法工作。我尝试查看文件夹的权限。我已经将“Network Service”赋予了完全控制权限,但仍然在word.Documents.Open处得到未设置对象引用的错误。请问可能是什么问题?我被这个错误困住了,请帮帮我。非常感谢您的任何建议。谢谢。

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

    object oMissing = System.Reflection.Missing.Value;

    word.Visible = false;
    word.ScreenUpdating = false;
    string fileName = @"c:\OUTPUT\test.docx");
    Document doc = word.Documents.Open(filename, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing);
        doc.Activate();

抱歉,我无法为您提供确切的帮助,但我强烈建议不要在 Web 应用程序中使用 Office Interop,微软也不建议这样做,据我所知,Office 也没有被授权在 Web 服务器上使用。如果这与您无关,请原谅,有很多第三方组件可以为您执行此操作,但我从未使用过开源组件。 - Paulie Waulie
事件日志中有任何内容吗? - Paulie Waulie
2
那段代码有一个错误。字符串文件名 = @"c:\OUTPUT\test.docx"); <--- 末尾多了一个 )。请发布您应用程序中实际的代码。 - Eoin Campbell
事件日志中没有任何内容。 - nav100
创建桌面文件夹对我有帮助:https://dev59.com/rXNA5IYBdhLWcg3wVcJx - zchpit
7个回答

74

如果您仍在寻找答案,我刚刚为我的项目找到了它。

打开 DCOM 配置设置:

  1. 开始 -> dcomcnfg.exe
  2. 计算机
  3. 本地计算机
  4. 配置 DCOM
  5. 搜索 Microsoft Word 97-2003 文档 -> 属性

选项卡 Identity,将启动用户更改为交互式用户


8
请注意,在Windows 64位操作系统上,您必须以32位模式启动“MMC -32”,然后添加到组件服务中。否则,您将只看到64位组件。请参阅Schprit的IT博客http://schprit.blogspot.com/2010/11/using-microsoft-office-2007-with-dcom.html - Gary Kindel
6
这个解决方案是可行的,但只有当用户始终登录到服务器时才有效。根据http://support2.microsoft.com/kb/176799的说明:“交互式用户:应用程序将使用当前登陆到计算机的用户的安全上下文运行。如果选择了此选项且用户未登录,则应用程序将无法启动。” - GR7
1
哇,你是超级巨星 Gianni!我找了一个星期才找到这篇帖子! - Yster
文章提供了有关如何使用指定用户进行自动化的帮助。 - avrahamcool
1
我还需要将运行我的服务的用户添加到“安全”选项卡上的“启动和激活权限”和“访问权限”列表中。 - Roman Starkov
显示剩余3条评论

33

尝试这个方法,它可能会帮助您。

在以下路径中创建一个名为"Desktop"的新目录:

  • "C:\Windows\SysWOW64\config\systemprofile"

  • "C:\Windows\System32\config\systemprofile"

在寻找解决方案的漫长一天之后,这种方法对我有效。看起来是一个用户配置文件的问题。


1
这个路径上已经有一个名为“桌面”的文件夹,但它仍然无法工作。 - ShaileshDev
对我有用。谢谢。 - Alpesh
在使用API方法并出现“文档无法打开,因为系统配置文件没有桌面”错误后,我尝试了这个方法,它对我很有效。非常棒! - Mark Walker
谢谢!我找了很久,但这个解决了我的问题。 - BIJIN PALAKKAL

6
我按照以下步骤进行操作,一切正常:
  • 创建桌面文件夹
  • 将DCOM元素更改为使用特定用户登录,而不是启动/交互式用户
  • 更改服务,使其以相同的特定用户启动

2019-09-29编辑。 由于进行了大型Windows更新,我不得不再次进行完全相同的操作。


我们在运行Word作为计划任务时遇到了问题,之前需要用户登录。当重新配置任务以在新帐户下运行时,它停止工作了。这使得任务可以在用户未登录的情况下运行。 - Alexander Higgins

3
为了解决这个问题,我必须做两件事情:
  • 创建以下目录:

    • C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft \Windows\INetCac‌he
    • C:\Windows\System32\config\systemprofile\Desktop
  • 启用 DCOM 设置 就像 @gianni-b 所说的那样

如果由于不同语言而难以找到 DCOM 条目,可以按照以下步骤操作:

  1. 开始菜单 > regedit
  2. 导航至 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{00020906-0000-0000-C000-000000000046}
  3. 右键单击 > 新建 > 字符串值

    • 对于键,请输入 RunAs
    • 对于值,请输入 Interactive User

您也可以在 AppID {00020812-0000-0000-C000-000000000046} 上为 Excel 执行相同的操作。


1

虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - OhBeWise

0

正如Paulie在他的评论中所说,我认为问题主要是由于Web服务器上的库。你可能能够通过黑客方式让它在Web应用程序上工作,但我建议不要这样做。

编辑:啊,我误读了帖子,只是假设Excel。根据我的经验,大多数人在使用Office.Interop时都会寻找它;)

有一个开放的库可以处理DocX格式(输入链接说明)。不幸的是,他在页面上承认,如果没有Office.Interop库,将其转换为PDF等格式几乎是不可能的(http://cathalscorner.blogspot.com/2009/10/converting-docx-into-doc-pdf-html.html

这里有一个“有前途”的替代方案,但效果因人而异。


EPPlus是一个Excel库。它如何帮助他将Word文档转换为PDF? - Eoin Campbell
现在编辑了一些实际有用的信息。在 DV 上略感失望 - Killnine

0

您的网站服务器上很可能有一个不同版本的word dll,也许是老版本的。我建议您引用一个指定的dll并将其复制到Web服务器上,这样您就可以确保您正在使用与测试代码相同且可正常工作的word dll。 在使用互操作性时可能会出现一些问题,但是,word interop是唯一可以确保正确转换word文件的选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接