共用方式為


文件層級自訂的程式設計

當您使用文件層級自訂擴充 Microsoft Office Word 或 Microsoft Office Excel 時,可以執行下列工作:

  • 使用物件模型自動化應用程式。

  • 將控制項加入文件介面。

  • 從自訂組件呼叫文件中的 Visual Basic for Applications (VBA) 程式碼。

  • 從 VBA 呼叫自訂組件中的程式碼。

  • 在文件位於未安裝 Microsoft Office 的伺服器上時,管理文件的特定層面。

  • 自訂應用程式的使用者介面 (UI)。

    適用對象:本主題資訊適用於 Excel 及 Word 的文件層級專案。 如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能

    在文件層級專案中撰寫程式碼時,某些方面會與 Visual Studio 中其他類型的專案不同。 其中有許多差異的原因來自於將 Office 物件模型公開給 Managed 程式碼的方式。 如需詳細資訊,請參閱撰寫 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 Runtime 中的主項目類型是介面,因此產生的類別無法從它們衍生其實作。 相反地,產生的類別會改從下列基底類別衍生大部分的成員:

  • ThisDocument:衍生自 DocumentBase

  • ThisWorkbook:衍生自 WorkbookBase

  • Sheet n:衍生自 WorksheetBase.

    這些基底類別會將所有成員的呼叫重新導向至 Visual Studio Tools for Office Runtime 中,與其對應之主項目介面的內部實作。 例如,如果呼叫 ThisDocument 類別的 Protect 方法,DocumentBase 類別會將此呼叫重新導向至 Visual Studio Tools for Office Runtime 中 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 物件模型中 Save 物件的 Document 方法。

如需使用 Word 和 Excel 物件模型的詳細資訊,請參閱 Word 物件模型概觀Excel 物件模型概觀

如需關於 Globals 物件的詳細資訊,請參閱全域存取 Office 專案中的物件

將控制項加入文件

若要自訂文件的 UI,您可以將 Windows Forms 控制項或 「主控制項」 (host control) 加入文件介面。 藉由結合不同組的控制項並撰寫程式碼,您可以將控制項繫結至資料、從使用者收集資訊,以及回應使用者動作。

主控制項是一種會擴充 Word 和 Excel 物件模型中某些物件的類別。 例如, ListObject 主控制項會提供 Excel 中 ListObject 的所有功能。 但是, ListObject 主控制項還多了一些事件和資料繫結功能。

如需詳細資訊,請參閱主項目和主控制項概觀Office 文件上的 Windows Forms 控制項概觀

合併 VBA和文件層級自訂

您可以在屬於文件層級自訂一部分的文件中使用 VBA 程式碼。 您可以從自訂組件呼叫文件中的 VBA 程式碼,也可以將專案設定為允許文件中的 VBA 程式碼呼叫自訂組件中的程式碼。

如需詳細資訊,請參閱結合 VBA 和文件層級自訂

管理伺服器上的文件

您可以在未安裝 Microsoft Office Word 或 Microsoft Office Excel 的伺服器上管理文件層級自訂的數個不同層面。 例如,您可以存取及修改文件之資料快取中的資料。 您也可以管理與文件相關聯的自訂組件。 例如,您可以用程式設計的方式從文件中移除組件,讓文件不再執行程式碼,或者用程式設計的方式將組件附加至文件。

如需詳細資訊,請參閱使用 ServerDocument 類別管理伺服器上的文件

自訂 Microsoft Office 應用程式的使用者介面

您可以使用文件層級自訂,透過下列方式自訂 Word 和 Excel 的 UI:

在文件層級自訂中,取得從原生 Office 物件擴充的物件

Office 事件的多數事件處理常式都會接收代表引發事件之活頁簿、工作表或文件的原生 Office 物件。 某些情況下,您可能只有在文件層級自訂的活頁簿或文件引發事件時,才想要執行一些程式碼。 例如,使用 Excel 的文件層級自訂時,您可能想要在使用者啟動自訂活頁簿內其中一個工作表時執行一些程式碼,但不要在使用者啟動某個恰巧同時開啟之其他活頁簿內的工作表時執行程式碼。

當您有原生 Office 物件時,可以測試該物件是否已擴充成為文件層級自訂中的 「主項目」 (host item) 或 「主控制項」 (host control)。 主項目和主控制項是 Visual Studio Tools for Office Runtime 所提供的類型執行個體,可為原本存在於 Word 或 Excel 物件模型中的物件 (稱為原生 Office 物件) 新增功能。 通常,主項目和主控制項也稱為 「擴充物件」(extended object)。 如需主項目和主控制項的詳細資訊,請參閱主項目和主控制項概觀

了解 GetVstoObject 和 HasVstoObject 方法

若要測試原生 Office 物件,請在專案中使用 HasVstoObjectGetVstoObject 方法:

  • 如果您想要判斷自訂中是否有原生 Office 物件的擴充物件,請使用 HasVstoObject 方法。 如果原生 Office 物件具有擴充物件,這個方法會傳回 true 否則傳回 false

  • 如果您想要取得原生 Office 物件的擴充物件,請使用 GetVstoObject 方法。 如果指定的原生 Office 物件具有擴充物件,這個方法會傳回 ListObjectWorkbookWorksheetDocument 物件。 否則,GetVstoObject 會傳回 Null。 例如,如果指定的 Document 是 Word 文件專案中文件的基礎物件,則 GetVstoObject 方法會傳回 Document

    在文件層級專案中,您無法使用 GetVstoObject 方法在執行階段建立新的 WorkbookWorksheetDocument 主項目。 您只能使用這個方法來存取在設計階段產生於專案中的現有主項目。 如果您想要在執行階段建立新的主項目,則必須開發 VSTO 增益集專案。 如需詳細資訊,請參閱「主項目和主控制項的程式設計限制」「在執行階段擴充 VSTO 增益集中的 Word 文件和 Excel 活頁簿」

使用 GetVstoObject 和 HasVstoObject 方法

若要呼叫 HasVstoObjectGetVstoObject 方法,請使用 Globals.Factory.GetVstoObjectGlobals.Factory.HasVstoObject 方法,並傳入要測試的原生 Word 或 Excel 物件 (例如 DocumentWorksheet)。