对文档级自定义项进行编程
使用文档级自定义项扩展 Microsoft Office Word 或 Microsoft Office Excel 时,可以执行以下任务:
通过使用应用程序的对象模型来实现应用程序的自动化。
向文档图面添加控件。
从自定义项程序集中调用文档中的 Visual Basic for Applications (VBA) 代码。
从 VBA 中调用自定义项程序集内的代码。
当文档位于未安装 Microsoft Office 的服务器上时,管理该文档的某些方面。
自定义应用程序的用户界面 (UI)。
**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2013 和 Excel 2010;Word 2013 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
与 Visual Studio 中其他类型的项目相比,在文档级项目中编写代码有一些不同之处。其中的许多不同是由向托管代码公开 Office 对象模型的方式引起的。有关更多信息,请参见在 Office 解决方案中编写代码。
有关文档级自定义项和可使用 Visual Studio 中的 Office 开发工具创建的其他类型的解决方案的常规信息,请参见 Office 解决方案开发概述。
在文档级项目中使用生成的类
创建文档级项目时,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 Runtime 是接口,因此,生成的选件类无法从它们派生其实现。相反,生成的类从下列基类派生其大多数成员:
ThisDocument:从 Microsoft.Office.Tools.Word.DocumentBase派生。
ThisWorkbook:从 Microsoft.Office.Tools.Excel.WorkbookBase派生。
Sheetn:从 Microsoft.Office.Tools.Excel.WorksheetBase派生。
这些基类将对其成员的所有调用重定向到 Visual Studio Tools for Office Runtime中对应宿主项接口的内部实现。例如,调用,则 ThisDocument 选件类的 Protect 方法,Microsoft.Office.Tools.Word.DocumentBase 选件类会将此调用重定向到 Microsoft.Office.Tools.Word.Document 接口的内部实现在 Visual Studio Tools for Office Runtime的。
访问宿主应用程序的对象模型
若要访问宿主应用程序的对象模型,请在项目中使用生成的类的成员。这些类中的每个类均对应于 Excel 或 Word 对象模型中的一个对象,并且,它们包含的属性、方法和事件大部分相同。例如,Word 文档级项目中的 ThisDocument 类提供的成员与 Word 对象模型中的 Microsoft.Office.Interop.Word.Document 对象提供的成员大部分相同。
下面的代码示例演示如何使用 Word 对象模型保存作为 Word 文档级自定义项的一部分的文档。将从 ThisDocument 类中运行此示例。
Me.Save()
this.Save();
若要从 ThisDocument 类以外执行相同的操作,请使用 Globals 对象访问 ThisDocument 类。例如,如果要在操作窗格 UI 中包含一个**“保存”**按钮,则可以将此代码添加到操作窗格代码文件中。
Globals.ThisDocument.Save()
Globals.ThisDocument.Save();
由于 ThisDocument 类从 Microsoft.Office.Tools.Word.Document 宿主项获取其大多数成员,因此在此代码中调用的 Save 方法实际上是 Microsoft.Office.Tools.Word.Document 宿主项的 Save 方法。此方法与 Word 对象模型中的 Microsoft.Office.Interop.Word.Document 对象的 Save 方法相对应。
有关使用 Word 和 Excel 的对象模型的更多信息,请参见 Word 对象模型概述和 Excel 对象模型概述。
有关 Globals 对象的更多信息,请参见对 Office 项目中对象的全局访问。
向文档添加控件
若要自定义文档的 UI,可以向文档图面添加 Windows 窗体控件或“宿主控件”。通过组合不同的控件集并编写代码,可将控件绑定到数据,从用户那里收集信息并对用户操作做出响应。
宿主控件是扩展 Word 和 Excel 对象模型中的某些对象的类。例如,Microsoft.Office.Tools.Excel.ListObject 宿主控件提供 Excel 中 Microsoft.Office.Interop.Excel.ListObject 的所有功能。但是,Microsoft.Office.Tools.Excel.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 Runtime 提供的类型,这些类型向本身存在于 Word 或 Excel 对象模型中的对象(称为“本机 Office 对象”)添加功能。总而言之,宿主项和宿主控件也称为" 扩展对象。有关宿主项和宿主控件的更多信息,请参见 宿主项和宿主控件概述。
了解 GetVstoObject 和 HasVstoObject 方法
若要测试本机 Office 对象,请在项目中使用 HasVstoObject 和 GetVstoObject 方法:
如果要确定本机 Office 对象是否在自定义项中有扩展对象,请使用 HasVstoObject 方法。如果本机 Office 对象具有扩展对象,此方法将返回 true,否则将返回 false。
如果要获取本机 Office 对象的扩展对象,请使用 GetVstoObject 方法。此方法将返回 Microsoft.Office.Tools.Excel.ListObject、Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet 或 Microsoft.Office.Tools.Word.Document 对象(如果指定的本机 Office 对象具有其中一个对象)。否则,GetVstoObject 返回 null。例如,如果指定的 Microsoft.Office.Interop.Word.Document 是 Word 文档项目中的文档的基础对象,则 GetVstoObject 方法将返回 Microsoft.Office.Tools.Word.Document。
在文档级项目中,不能使用 GetVstoObject 方法在运行时创建新的 Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet 或 Microsoft.Office.Tools.Word.Document 宿主项。只能使用该方法来访问设计时在项目中生成的现有宿主项。如果要在运行时创建新的宿主项,则必须开发应用程序级项目。有关更多信息,请参见宿主项和宿主控件的编程限制和在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿。
使用 GetVstoObject 和 HasVstoObject 方法
若要调用 HasVstoObject 和 GetVstoObject 方法,使用 Globals.Factory.GetVstoObject 或 Globals.Factory.HasVstoObject 方法并传入该本机 Word 或 Excel 的对象 (例如 Microsoft.Office.Interop.Word.Document 或 Microsoft.Office.Interop.Excel.Worksheet) 要测试。