在哪里使用Interop失败?如果未安装Office,请不要使用Office.Interop。后期绑定?

时间:2015-07-30 18:21:19

标签: c# ms-word assemblies office-interop novacode-docx

我的Windows窗体应用程序使用Novacode DocX从模板中编写文档。该项目的Novacode部分工作正常,文件保存。问题是,当我加载文档时,当Novacode部分添加标题等时,不会更新字段/目录(目录)。

我能做到,write a macro to update fields on open。这可以解决问题,但不是每个将使用我的应用程序的人都会有这个宏。由于各种原因,我无法将文件保存为附带宏的.docm文件(假设文件必须为“.docx”)。

我发现Microsoft.office.interop.Word程序集允许我调用“Fields.Update”。我的理解是这将解决问题,但我不能阻止没有安装word的用户运行我的应用程序。我的理解是,如果我是“使用Microsoft.Office.Interop.Word”,或者在我的引用中有这样的话,那么如果有人没有单词,应用程序将无法运行。

所以我有code that checks if word is installed。如果我运行它并安装它,那么我可以使用“Late Binding”来运行互操作代码吗?其他related questionsreplies指向“NetOffice”作为运行互操作的方式,而不检查是否安装了单词。

我正试图通过我的研究尽可能全面地做到这一点。我的问题非常类似于这个问题“ how do I easily test the case where my C# application can't find an external assembly?“。我希望很快就能解决这个问题,但我不确定会是什么。

旁注,如果有人知道更新字段的方法,甚至只是现有的TOC,那么以“.docx”格式保存的单词文档没有安装任何单词会很棒,并且会绕过我的整个问题。虽然我仍然想知道互操作问题的答案。

这也是我在StackOverflow上的第一个真正的问题,如果你有标签建议请与你的答案一起这样做。如果您对我如何提出问题有反馈意见,我也会接受,但请不要在没有任何答案的情况下关闭/删除问题。我链接到类似的问题,但这些问题在一段时间内没有得到回应。我相信我已按照规则做了一切。

2 个答案:

答案 0 :(得分:0)

这更像是对"的解决方案;如果有人知道如何更新保存在" .docx&中的word文档的字段,甚至只是现有的TOC #34;格式没有安装单词" 问题,但您可能想要查看Open XML SDK for Office

这将允许您修改.docx文件,而不依赖于安装Word。

我发现this tutorial我认为使用Open XML SDK几乎完全符合您的要求。

答案 1 :(得分:0)

很多话要说,但我想我找到了答案

主要问题是,如果我添加对“Microsoft.Office.Interop.Word”的引用,并且运行该应用程序的客户端没有单词, 其中 应用程序会失败吗?我现在的理解是,如果客户端没有字,它将不会在启动时失败。但是,当达到使用“Office.Interop.Word”的代码时,它将失败。

防止这种情况的方法是一种简单的注册表检查方法。我使用了This method的变体来检查注册表。然后在运行使用“Office.Interop.Word”代码的任何代码之前,检查客户端是否在注册表中有单词。如果他们没有言语,我会对我的申请采取适当的通知行动。我还将“try catch”异常块中的“Office.Interop.Word”代码包围为双重安全措施。在我的代码中,异常意味着没有安装word。使用“Office.Interop.Word”的代码变体我可以在here找到用于更新字段的代码。

Novacode DocX可以支持Docm文件if you change the code yourself。我不想,也没有使用docm文件。 Docm文件在通过电子邮件发送时会附带与之关联的安全警告。所以auto updating macro是不可能的。

-Octopus Emoji正在庆祝