程序文档级自定义

使用文档级自定义扩展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.

  • Sheet n:派生自 WorksheetBase.

    这些基类将所有对成员的调用重定向到 Visual Studio Tools for Office 运行时中相应主机项接口的内部实现。 例如,如果调用Protect类的方法,该类会将此调用重定向到DocumentBase类在 Visual Studio Tools for Office 运行时中的Document接口的内部实现。

访问主机应用程序的对象模型

若要访问主机应用程序的对象模型,请在项目中使用生成的类的成员。 其中每个类对应于 Excel 或 Word 的对象模型中的对象,并且它们包含大多数相同的属性、方法和事件。 例如,Word 文档级项目中的 ThisDocument 类提供与 Word 对象模型中的 Document 对象大多数相同的成员。

下面的代码示例演示如何使用 Word 对象模型保存作为 Word 文档级自定义的一部分的文档。 此示例旨在从 ThisDocument 类运行。

this.Save();

若要从 ThisDocument 类外部执行相同的操作,请使用 Globals 对象访问 ThisDocument 类。 例如,如果要在作窗格 UI 中包含 “保存 ”按钮,可以将此代码添加到作窗格代码文件中。

Globals.ThisDocument.Save();

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,方法是使用文档级自定义:

从文档级自定义项中的原生 Office 对象获取扩展对象

许多 Office 事件的事件处理程序接收一个本机 Office 对象,该对象表示引发事件的工作簿、工作表或文档。 在某些情况下,仅当在文档级自定义中,工作簿或文档触发事件时,你才可能想要运行一些代码。 例如,在 Excel 的文档级自定义中,当用户激活自定义工作簿中的某个工作表时,你可能想要运行一些代码,但当用户激活其他一些工作簿中恰好同时打开的工作表时,则不要运行一些代码。

拥有本机 Office 对象时,可以测试该对象是否已扩展到文档级自定义中的 主机项主机控件 。 主机项和主机控件是由 Visual Studio Tools for Office 运行时提供的类型,可将功能添加到 Word 或 Excel 对象模型中本机存在的对象(称为 本机 Office 对象)。 主机项和主机控件统称为 扩展对象。 有关主机项和主机控件的详细信息,请参阅 主机项和主机控件概述

了解 GetVstoObject 和 HasVstoObject 方法

若要测试本机 Office 对象,请使用项目中的 HasVstoObjectGetVstoObject 方法:

  • HasVstoObject如果要确定本机 Office 对象是否在自定义中具有扩展对象,请使用该方法。 如果本机 Office 对象具有扩展对象,则此方法返回 true ,否则返回 false

  • GetVstoObject如果要获取本机 Office 对象的扩展对象,请使用该方法。 如果指定的本机 Office 对象有一个,则此方法返回一个ListObjectWorkbookWorksheetDocument对象。 否则, GetVstoObject 返回 nullGetVstoObject 方法返回一个 Document 值,如果指定的 Document 是您 Word 文档项目中该文档的基础对象。

    在文档级项目中,不能使用GetVstoObject方法在运行时创建新的WorkbookWorksheetDocument宿主项。 只能使用此方法访问设计时在项目中生成的现有主机项。 如果要在运行时创建新的主机项,则必须开发 VSTO 外接程序项目。 有关详细信息,请参阅 主机项和主机控件的编程限制 ,以及 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿

使用 GetVstoObject 和 HasVstoObject 方法

若要调用 HasVstoObjectGetVstoObject 方法,请使用 Globals.Factory.GetVstoObjectGlobals.Factory.HasVstoObject 方法,并传入要测试的本机 Word 或 Excel 对象(如 DocumentWorksheet)。