如何在现有项目中实例化VSTO Word ThisDocument类?
我有一个需要生成Word文档的现有项目,已将新的Word ThisDocument项目(VSTO文档级项目)添加到当前解决方案,并在现有项目中添加了对它的引用。
我尝试通过以下代码在现有项目中实例化该类:
WordEditor.ThisDocument doc = new WordEditor.ThisDocument();
但出现错误:
There is no argument given that corresponds to the required parameter 'factory' of ThisDocument.ThisDocument(Factory, IServiceProvider)
该类的构造函数代码如下:
public ThisDocument(global::Microsoft.Office.Tools.Word.Factory factory, global::System.IServiceProvider serviceProvider) : base(factory, serviceProvider, "ThisDocument", "ThisDocument") { Globals.Factory = factory; }
我了解需要传入这两个参数,但不清楚如何在现有项目中获取它们?
首先明确:VSTO文档级项目的ThisDocument类不能通过new关键字手动实例化,它由Office运行时自动创建和管理,构造函数的参数也是Office宿主环境注入的,手动获取这些参数既不现实,也不符合VSTO的设计逻辑。
如果要在现有项目中生成Word文档并利用VSTO功能,推荐两种正确实现方式:
方式1:通过VSTO模板启动文档
直接启动VSTO项目生成的模板文件(.dotm或.docm),Office会自动初始化ThisDocument实例:
// 替换为你的VSTO模板实际路径 string templatePath = @"C:\Projects\YourTemplate.dotm"; // 启动Word并打开模板 Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application(); wordApp.Documents.Open(templatePath);
此时ThisDocument会被Office运行时自动创建,你可以在VSTO项目内部通过Globals.ThisDocument访问它,或在现有项目中通过Word对象模型操作文档内容。
方式2:改用VSTO应用级插件项目
如果需要灵活生成和操作Word文档,建议将VSTO项目改为应用级插件(Word Add-in),而非文档级项目。应用级项目不绑定特定模板,可直接在现有项目中调用Word对象模型创建文档,同时利用VSTO扩展功能:
// 创建新的空白Word文档 Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Add(); // 若需使用VSTO的扩展功能(如HostItem),可通过以下方式获取 var vstoDoc = Globals.Factory.GetVstoObject(doc); // 现在可以使用vstoDoc的VSTO专属扩展能力
补充说明
VSTO文档级类(如ThisDocument、Excel的Sheet1等)是Office宿主与.NET之间的桥梁,它们的构造依赖Office提供的工厂和服务对象——这些对象仅在Office加载对应模板时才会生成,手动传入的参数无法模拟真实的Office宿主环境,强行实例化会导致后续功能异常。
内容的提问来源于stack exchange,提问作者Kahalon

