You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在现有项目中实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:50:05