共用方式為


在執行階段於 VSTO 增益集中擴充 Word 文件和 Excel 活頁簿

您可以使用 VSTO 增益集,以下列方式自訂 Word 文件和 Excel 活頁簿:

  • 將受控項新增至任何開啟的文件或工作表。

  • 將 Excel 工作表上的現有清單物件轉換成延伸物件 ListObject ,以公開事件,並可使用 Windows Forms 資料繫結模型系結至資料。

  • 存取 Word 和 Excel 針對特定文件、活頁簿和工作表公開的應用程式層級事件。

    若要使用此功能,請在執行階段產生一個物件,以擴充文件或活頁簿。

    適用於: 本文中的資訊適用於下列應用程式的 VSTO 增益集專案:Excel 和 Word。 如需詳細資訊,請參閱 Office 應用程式和專案類型所提供的功能

在 VSTO 插件中產生擴展對象

擴充物件 是 Visual Studio Tools for Office 執行階段所提供的類型實例,可將功能新增至 Word 或 Excel 物件模型中原生存在的物件 (稱為 原生 Office 物件) 。 若要產生 Word 或 Excel 物件的延伸物件,請使用GetVstoObject 當您第一次呼叫 GetVstoObject 指定 Word 或 Excel 物件的方法時,它會傳回擴充指定物件的新物件。 每次呼叫方法並指定相同的 Word 或 Excel 物件時,它都會傳回相同的擴充物件。

擴充物件的類型與原生 Office 物件的類型具有相同的名稱,但類型是在 or Microsoft.Office.Tools.Excel 命名空間中Microsoft.Office.Tools.Word定義。 例如,如果您呼叫方法來 GetVstoObject 擴充物件 Document ,則該方法會傳回一個 Document 物件。

這些 GetVstoObject 方法主要用於 VSTO 增益集專案。 您也可以在文件層級專案中使用這些方法,但它們的行為不同,而且用途較少。

若要判斷是否已針對特定原生 Office 物件產生擴充物件,請使用方法 HasVstoObject 。 如需詳細資訊,請參閱 判斷 Office 物件是否已延伸

生成主機物件

當您使用GetVstoObject來擴充文件層級物件(例如WorkbookWorksheetDocument)時,傳回的物件稱為主項目。 主機項目是可以包含其他物件的類型,包括其他擴充物件和控制項。 它類似於 Word 或 Excel 主要互操作組件中的對應類型,但具有其他功能。 如需主機項目的詳細資訊,請參閱 主機項目和主機控制項概觀

產生主機項目之後,您可以使用它將受控項新增至文件、活頁簿或工作表。 如需詳細資訊,請參閱 將受控項新增至文件和工作表

生成 Word 文件的宿主項目

  • 下列程式碼範例示範如何產生作用中文件的主機項目。

    if (Globals.ThisAddIn.Application.Documents.Count > 0)
    {
        Microsoft.Office.Interop.Word.Document nativeDocument =
            Globals.ThisAddIn.Application.ActiveDocument;
        Microsoft.Office.Tools.Word.Document vstoDocument =
            Globals.Factory.GetVstoObject(nativeDocument);
    }
    

要為 Excel 活頁簿建立一個宿主項目

  • 下列程式碼範例示範如何產生作用中活頁簿的宿主項目。

    Microsoft.Office.Interop.Excel.Workbook nativeWorkbook = 
        Globals.ThisAddIn.Application.ActiveWorkbook;
    if (nativeWorkbook != null)
    {
        Microsoft.Office.Tools.Excel.Workbook vstoWorkbook = 
            Globals.Factory.GetVstoObject(nativeWorkbook);
    }
    

生成 Excel 工作表的宿主項

  • 下列程式碼範例示範如何為專案中的作用中工作表產生主項目。

    Microsoft.Office.Interop.Excel.Worksheet nativeWorksheet =
        Globals.ThisAddIn.Application.ActiveSheet;
    if (nativeWorksheet != null)
    {
        Microsoft.Office.Tools.Excel.Worksheet vstoSheet = 
            Globals.Factory.GetVstoObject(nativeWorksheet);
    }
    

產生 ListObject 主機控制項

當您使用該 GetVstoObject 方法擴展 a ListObject時,該方法會傳回一個 ListObjectListObject 具備原始 ListObject 的所有功能。 它也有其他功能,而且可以使用 Windows Forms 資料繫結模型繫結至資料。 如需詳細資訊,請參閱 ListObject 控制項

產生 ListObject 的主機控制項

  • 下列程式碼範例示範如何為專案中作用中工作表中的第一個ListObject產生 aListObject

    Microsoft.Office.Interop.Excel.Worksheet sheet =
        Globals.ThisAddIn.Application.ActiveSheet;
    if (sheet.ListObjects.Count > 0)
    {
        Excel.ListObject listObject = 
            sheet.ListObjects[1];
        Microsoft.Office.Tools.Excel.ListObject vstoListObject =
            Globals.Factory.GetVstoObject(listObject);
    }
    

將受控項新增至文件和工作表

產生 DocumentWorksheet之後,您可以將控制項新增至這些延伸物件所代表的文件或工作表。 若要新增控制項,請使用 ControlsDocument的屬性Worksheet。 如需詳細資訊,請參閱 在執行階段將控制項新增至 Office 文件

您可以新增 Windows Forms 控制項或 主機控制項。 主機控制項是 Visual Studio Tools for Office 執行階段所提供的控制項,可將對應的控制項包裝在 Word 或 Excel 主要互通元件中。 主機控制項會公開基礎原生 Office 物件的所有行為。 它也會引發事件,而且可以使用 Windows Forms 資料繫結模型系結至資料。 如需詳細資訊,請參閱 主機項目和主機控制項概觀

備註

您無法使用 VSTO 增益集將XmlMappedRange控制項新增至工作表,或將XMLNode控制項或XMLNodes控制項新增至文件。 無法以程式設計方式新增這些主機控制項。 如需詳細資訊,請參閱 主機專案和主機控制項的程式設計限制

保存和移除控制項

當您將受控項新增至文件或工作表時,當儲存文件然後關閉時,控制項不會保存。 所有主機控制項都會移除,因此只會留下基礎原生 Office 物件。 例如,a ListObject 會變成 ListObject。 所有 Windows Forms 控制項也會移除,但控制項的 ActiveX 包裝函式會保留在文件中。 您必須在 VSTO 增益集中包含程式碼,以清除控制項,或在下次開啟文件時重新建立控制項。 如需詳細資訊,請參閱 在 Office 文件中保存動態控制項

在文件和活頁簿上,存取應用程式層級的事件

原生 Word 和 Excel 物件模型中的某些文件、活頁簿和工作表事件只會在應用程式層級引發。 例如,DocumentBeforeSave 在 Word 中開啟文件時會引發事件,但此事件是定義在 Application 類別中,而不是在 Document 類別中。

當您在 VSTO 增益集中只使用原生 Office 物件時,您必須處理這些應用程式層級事件,然後撰寫其他程式碼,以判斷引發事件的文件是否是您已自訂的文件。 主機項目會在文件層級提供這些事件,以便更輕鬆地處理特定文件的事件。 您可以產生主機項目,然後處理該主機項目的事件。

使用原生 Word 物件的範例

下列程式碼範例示範如何處理 Word 文件的應用程式層級事件。 此 CreateDocument 方法會建立新文件,然後定義事件 DocumentBeforeSave 處理常式,以防止儲存此文件。 事件是針對Application物件觸發的應用程式層級事件,而事件處理常式必須將Doc參數與document1物件進行比較,以判斷document1是否代表已儲存的文件。

private Word.Document document1 = null;

private void CreateDocument1()
{
    document1 = this.Application.Documents.Add(ref missing,
        ref missing, ref missing, ref missing);
    this.Application.DocumentBeforeSave += 
        new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(
        Application_DocumentBeforeSave);
}

private void Application_DocumentBeforeSave(Word.Document Doc, 
    ref bool SaveAsUI, ref bool Cancel)
{
    if (Type.ReferenceEquals(Doc, document1)) 
    {
        Cancel = true;
    }
}

使用主機項目的範例

下列程式碼範例會藉由處理 BeforeSave 主機專案的 Document 事件來簡化此程式。 這些範例中的方法CreateDocument2會產生一個擴充document2物件的Document,然後定義一個防止文件被儲存的BeforeSave事件處理程式。 只有當document2被儲存時,事件處理常式才會被呼叫,而且可以在不需要執行任何額外工作的情況下取消儲存動作。

下列程式碼範例示範此工作。

private Word.Document document2 = null;
private Microsoft.Office.Tools.Word.Document vstoDocument = null;

private void CreateDocument2()
{
    document2 = this.Application.Documents.Add(ref missing,
        ref missing, ref missing, ref missing);
    vstoDocument = Globals.Factory.GetVstoObject(document2);
    vstoDocument.BeforeSave += new SaveEventHandler(vstoDocument_BeforeSave);
}

private void vstoDocument_BeforeSave(object sender, SaveEventArgs e)
{
    e.Cancel = true;
}

判斷 Office 物件是否已延伸

若要判斷是否已針對特定原生 Office 物件產生擴充物件,請使用方法 HasVstoObject 。 如果已產生擴充物件,則此方法會傳回 true

使用 Globals.Factory.HasVstoObject 方法。 將原生 Word 或 Excel 物件(例如 DocumentWorksheet)傳入,以判斷其是否為擴充物件。

當您只想在指定的 Office 物件具有擴充物件時執行程式碼時,此 HasVstoObject 方法很有用。 例如,如果您有 Word VSTO 增益集來處理 DocumentBeforeSave 事件,以便在儲存文件前移除文件中的託管控制項,請使用 HasVstoObject 方法來判斷文件是否已被擴充。 如果文件尚未擴充,則無法具有管理控制項,事件處理常式可以返回,而不需要嘗試清除文件上的控制項。