使用文档级自定义扩展Microsoft Office Word 或Microsoft Office Excel 时,可以执行以下任务:
- 使用其对象模型自动执行应用程序。 
- 将控件添加到文档的表面。 
- 从自定义程序集调用 Visual Basic for Applications (VBA) 代码到文档中。 
- 从 VBA 调用自定义程序集中的代码。 
- 在未安装 Microsoft Office 的服务器上管理文档的某些方面。 
- 自定义应用程序的用户界面(UI)。 - 适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能。 - 在文档级项目中编写代码的某些方面与 Visual Studio 中的其他类型的项目不同。 其中许多差异是由于 Office 对象模型向托管代码公开的方式造成的。 有关详细信息,请参阅 在 Office 解决方案中编写代码。 - 有关文档级自定义项和可以使用 Visual Studio 中的 Office 开发工具创建的其他类型的解决方案的一般信息,请参阅 Office 解决方案开发概述(VSTO)。 
在文档级项目中使用生成的类
创建文档级项目时,Visual Studio 会在项目中自动生成一个类,可用于开始编写代码。 Visual Studio 为 Word 和 Excel 生成不同的类:
- 在 Word 的文档级项目中,默认情况下会调用 - ThisDocument该类。
- Excel 的文档级项目有多个生成的类:一个用于工作簿本身,一个用于每个工作表。 默认情况下,这些类具有以下名称: - ThisWorkbook
- Sheet1
- Sheet2
- Sheet3
 - 生成的类包括打开或关闭文档时调用的事件处理程序。 若要在打开文档时运行代码,请将代码添加到 - Startup事件处理程序。 若要在文档关闭前运行代码,请将代码添加到- Shutdown事件处理程序。 有关详细信息,请参阅 Office 项目中的事件。
了解生成的类的设计
在面向 .NET Framework 4 或 .NET Framework 4.5 的项目中,Visual Studio Tools for Office 运行时中的主机项类型是接口,因此生成的类无法从它们派生其实现。 相反,生成的类从以下基类派生其大部分成员:
- ThisDocument:派生自 DocumentBase.
- ThisWorkbook:派生自 WorkbookBase.
- Sheetn:派生自 WorksheetBase.- 这些基类将所有对成员的调用重定向到 Visual Studio Tools for Office 运行时中相应主机项接口的内部实现。 例如,如果调用Protect类的方法,该类会将此调用重定向到DocumentBase类在 Visual Studio Tools for Office 运行时中的Document接口的内部实现。 
访问主机应用程序的对象模型
若要访问主机应用程序的对象模型,请在项目中使用生成的类的成员。 其中每个类对应于 Excel 或 Word 的对象模型中的对象,并且它们包含大多数相同的属性、方法和事件。 例如,Word 文档级项目中的 ThisDocument 类提供与 Word 对象模型中的 Document 对象大多数相同的成员。
下面的代码示例演示如何使用 Word 对象模型保存作为 Word 文档级自定义的一部分的文档。 此示例旨在从 ThisDocument 类运行。
若要从 ThisDocument 类外部执行相同的操作,请使用 Globals 对象访问 ThisDocument 类。 例如,如果要在作窗格 UI 中包含 “保存 ”按钮,可以将此代码添加到作窗格代码文件中。
              ThisDocument类从Document宿主项获取其大部分成员,因此在此代码中所调用的Save方法实际上是Save宿主项的Document方法。 此方法对应于 Word 对象模型中某个对象 Document 的方法 Save 。
有关使用 Word 和 Excel 的对象模型的详细信息,请参阅 Word 对象模型概述 和 Excel 对象模型概述。
有关该 Globals 对象的详细信息,请参阅 对 Office 项目中对象的全局访问。
向文档添加控件
若要自定义文档的 UI,可以将 Windows 窗体控件或 主机控件 添加到文档图面。 通过组合不同的控件集和编写代码,可以将控件绑定到数据、从用户收集信息以及响应用户作。
主机控件是扩展 Word 和 Excel 对象模型中某些对象的类。 例如,ListObject 主机控件提供了 Excel 中 ListObject 的所有功能。 但是, ListObject 主机控件还具有其他事件和数据绑定功能。
有关详细信息,请参阅 主机项和主机控件概述 和 Office 文档上的 Windows 窗体控件概述。
合并 VBA 和文档级自定义
您可以在作为文档级自定义一部分的文档中使用 VBA 代码。 可以从自定义程序集调用文档中的 VBA 代码,还可以将项目配置为在文档中启用 VBA 代码以调用自定义程序集中的代码。
有关详细信息,请参阅 合并 VBA 和文档级自定义。
管理服务器上的文档
可以在未安装 Microsoft Office Word 或Microsoft Office Excel 的服务器上管理文档级自定义的多个不同方面。 例如,可以在文档的数据缓存中访问和修改数据。 还可以管理与文档关联的自定义程序集。 例如,你可以以编程方式从文档中删除程序集,以便文档不再运行代码,也可以以编程方式将程序集附加到文档。
有关详细信息,请参阅 使用 ServerDocument 类管理服务器上的文档。
自定义 Microsoft Office 应用程序的用户界面
可以通过以下方式自定义 Word 和 Excel 的 UI,方法是使用文档级自定义:
- 将主机控件或 Windows 窗体控件添加到文档图面。 - 有关详细信息,请参阅 “使用扩展对象自动执行 Word”、“ 使用扩展对象自动执行 Excel”和 Office 文档上的 Windows 窗体控件概述。 
- 向文档添加操作窗格。 - 有关详细信息,请参阅 “操作窗格概述”。 
- 将自定义选项卡添加到功能区。 - 有关详细信息,请参阅 功能区概述。 
- 将自定义组添加到功能区上的内置选项卡中。 - 有关详细信息,请参阅 “如何:自定义内置的选项卡”。 - 有关自定义 Microsoft Office 应用程序的 UI 的详细信息,请参阅 Office UI 自定义。 
从文档级自定义项中的原生 Office 对象获取扩展对象
许多 Office 事件的事件处理程序接收一个本机 Office 对象,该对象表示引发事件的工作簿、工作表或文档。 在某些情况下,仅当在文档级自定义中,工作簿或文档触发事件时,你才可能想要运行一些代码。 例如,在 Excel 的文档级自定义中,当用户激活自定义工作簿中的某个工作表时,你可能想要运行一些代码,但当用户激活其他一些工作簿中恰好同时打开的工作表时,则不要运行一些代码。
拥有本机 Office 对象时,可以测试该对象是否已扩展到文档级自定义中的 主机项 或 主机控件 。 主机项和主机控件是由 Visual Studio Tools for Office 运行时提供的类型,可将功能添加到 Word 或 Excel 对象模型中本机存在的对象(称为 本机 Office 对象)。 主机项和主机控件统称为 扩展对象。 有关主机项和主机控件的详细信息,请参阅 主机项和主机控件概述。
了解 GetVstoObject 和 HasVstoObject 方法
若要测试本机 Office 对象,请使用项目中的 HasVstoObject 和 GetVstoObject 方法:
- HasVstoObject如果要确定本机 Office 对象是否在自定义中具有扩展对象,请使用该方法。 如果本机 Office 对象具有扩展对象,则此方法返回 true ,否则返回 false 。
- GetVstoObject如果要获取本机 Office 对象的扩展对象,请使用该方法。 如果指定的本机 Office 对象有一个,则此方法返回一个ListObject、Workbook、Worksheet或Document对象。 否则,- GetVstoObject返回 null。- GetVstoObject方法返回一个 Document 值,如果指定的 Document 是您 Word 文档项目中该文档的基础对象。- 在文档级项目中,不能使用 - GetVstoObject方法在运行时创建新的Workbook、Worksheet或Document宿主项。 只能使用此方法访问设计时在项目中生成的现有主机项。 如果要在运行时创建新的主机项,则必须开发 VSTO 外接程序项目。 有关详细信息,请参阅 主机项和主机控件的编程限制 ,以及 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿。
使用 GetVstoObject 和 HasVstoObject 方法
若要调用 HasVstoObject 和 GetVstoObject 方法,请使用 Globals.Factory.GetVstoObject 或 Globals.Factory.HasVstoObject 方法,并传入要测试的本机 Word 或 Excel 对象(如 Document 或 Worksheet)。