我有一个用c#编写的Windows服务,它使用VBA Interop从word文档(doc和docx)中读取文本。但是在某些文档上似乎挂起了对Open方法的调用。似乎问题文档中都有宏。本地安装的word版本禁用了宏,我用来打开文档的代码如下:
using Word = Microsoft.Office.Interop.Word;
using OfficeCore = Microsoft.Office.Core;
Word.Application m_wordApp = new Word.ApplicationClass();
Word.Document m_wordDoc = null;
object TRUE_VALUE = true;
object FALSE_VALUE = false;
object MISSING_VALUE = System.Reflection.Missing.Value;
m_wordApp.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone; //will still fail with this line removed
m_wordApp.Visible = false; //will still fail with this line removed
m_wordApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable; //will still fail with this line removed
m_wordDoc = m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE);
我可以在我的开发机器上手动处理这些文档。有谁知道为什么会发生这种情况或对我的问题有任何进一步的疑问?
答案 0 :(得分:5)
Microsoft.Office.Interop.Word
使用COM包装器远程控制实际的Word可执行文件。这绝对是可怕的。在其正在使用的Word副本中禁用宏的设置几乎肯定是用户特定的设置,Windows服务将运行Word作为运行该服务的任何用户帐户。很有可能它实际上是在Windows服务用户桌面/ ui的一些理论网络世界中弹出某种宏安全对话框。
答案 1 :(得分:4)
我希望最终找到与此相关的所有问题并最终以下面的行打开文档:
m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref TRUE_VALUE, ref MISSING_VALUE, ref TRUE_VALUE, ref MISSING_VALUE);
第4个和第2个最后一个参数阻止修复和编码对话框打开,修复了大多数错误。
在没有通知的情况下关闭禁用宏的注册表项是:
[HKEY_USERS\S-x-x-xx-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxx\Software\Microsoft\Office\12.0\Word\Security]
"VBAWarnings"=dword:00000004
最后,毕竟还有文档崩溃了服务并泄漏了winword实例。以服务用户身份登录并打开其中一个文档后,我从单词“Word无法启动转换器mswrd632”获得此消息对话框。通过删除注册表项来解决此问题,如http://support.microsoft.com/kb/973904中所述。
编辑:我还发现因为没有安装VBA,Word打开了一个对话框,告诉服务这导致一些文件挂起服务。重新安装然后禁用Word本身(如上所述)进行了一些文档处理。还有一些无法处理的文件。考虑使用ikvmc尝试http://poi.apache.org/text-extraction.html来解析文档。
答案 2 :(得分:2)
Microsoft提出了针对服务器端自动化的建议,但是如果您仍然需要这样做,还有很多资源可以帮助您。这两篇文章应该为您提供足够的背景知识:
但是,如果由于任何AutoMacros(例如AutoOpen
)而导致文档挂起,就在后面的VBA代码中,则需要使用WordBasic来禁用它们。我永远无法在C#中使用它,但我在VB.NET中完成了。见How to open document that contains AutoOpen macro with PowerShell?
最后一个选择是考虑为服务器端Office自动化构建的工具,例如Apose.Words。
答案 3 :(得分:2)
Word会在文档出现轻微问题时提示用户。该提示将显示在您的案例中的服务桌面上,没有人能听到它尖叫。并阻止Open()方法调用完成。
确保将Open()方法的OpenAndRepair参数设置为True,以便在不提示用户的情况下自动处理。
答案 4 :(得分:2)
您也可以尝试调用documents.OpenNoRepairDialog(...)方法。它适用于2007年及以后的办公室。
请注意,我正在使用直接的COM调用,因此我不确定它是否存在于office互操作库中。