文件層級自訂程式設計
當您使用文件層級自訂擴充 Microsoft Office Word 或 Microsoft Office Excel 時,可以執行下列工作:
使用物件模型自動化應用程式。
將控制項加入至文件介面。
從自訂組件 (Assembly) 呼叫文件中的 Visual Basic for Applications (VBA) 程式碼。
從 VBA 呼叫自訂組件中的程式碼。
在文件位於未安裝 Microsoft Office 的伺服器上時,管理文件的某些方面。
自訂應用程式的使用者介面 (UI)。
**適用於:**本主題中的資訊適用於下列應用程式的文件層級專案:Excel 2013 和 Excel 2010、Word 2013 和 Word 2010。如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能。
在文件層級專案中撰寫程式碼時,某些方面會與 Visual Studio 中其他類型的專案不同。在這些差異中,有許多都是因為將 Office 物件模型公開為 Managed 程式碼的方式所造成。如需詳細資訊,請參閱撰寫 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 中包含 [Save] 按鈕,可以將這個程式碼加入至執行窗格程式碼檔案。
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 Form 控制項或「主控制項」(Host Control) 加入至文件介面。藉由合併不同組的控制項並撰寫程式碼,您可以將控制項繫結至資料、從使用者收集資訊,以及回應使用者動作。
主控制項是一種會擴充 Word 和 Excel 物件模型中某些物件的類別。例如,Microsoft.Office.Tools.Excel.ListObject 主控制項會提供 Excel 中 Microsoft.Office.Interop.Excel.ListObject 的所有功能。但是,Microsoft.Office.Tools.Excel.ListObject 主控制項還多了一些事件和資料繫結 (Data Binding) 功能。
如需詳細資訊,請參閱主項目和主控制項概觀與Office 文件上的 Windows Form 控制項概觀。
合併 VBA 和文件層級自訂
您可以在屬於文件層級自訂一部分的文件中使用 VBA 程式碼。您可以從自訂組件呼叫文件中的 VBA 程式碼,也可以將專案設定為允許文件中的 VBA 程式碼呼叫自訂組件中的程式碼。
如需詳細資訊,請參閱合併 VBA 和文件層級自訂。
管理伺服器上的文件
您可以在未安裝 Microsoft Office Word 或 Microsoft Office Excel 的伺服器上管理文件層級自訂的數個不同方面。例如,您可以存取及修改文件之資料快取中的資料。您也可以管理與文件相關聯的自訂組件。例如,您可以用程式設計的方式從文件中移除組件,讓文件不再執行程式碼,或者用程式設計的方式將組件附加至文件。
如需詳細資訊,請參閱使用 ServerDocument 類別管理伺服器上的文件。
自訂 Microsoft Office 應用程式的使用者介面
您可以使用文件層級自訂,透過下列方式自訂 Word 和 Excel 的 UI:
將主控制項或 Windows Form 控制項加入至文件介面。
如需詳細資訊,請參閱使用擴充物件自動化 Word、使用擴充物件自動化 Excel 和 Office 文件上的 Windows Form 控制項概觀。
將執行窗格加入至文件。
如需詳細資訊,請參閱執行窗格概觀。
對功能區的自訂選項。
如需詳細資訊,請參閱功能區概觀。
加入一個內建索引標籤的自訂群組功能區。
如需詳細資訊,請參閱HOW TO:自訂內建索引標籤。
如需自訂 Microsoft Office 應用程式 UI 的詳細資訊,請參閱 Office UI 自訂。
延伸到原生 Office 物件的物件在文件層級自訂
Office 事件的多數事件處理常式都會接收代表引發事件之活頁簿、工作表或文件的原生 Office 物件。某些情況下,您可能只有在文件層級自訂的活頁簿或文件引發事件時,才想要執行一些程式碼。例如,使用 Excel 的文件層級自訂時,您可能想要在使用者啟動自訂活頁簿內其中一個工作表時執行一些程式碼,但不要在使用者啟動某個恰巧同時開啟之其他活頁簿內的工作表時執行程式碼。
當您有原生 Office 物件時,可以測試該物件是否已擴充成為文件層級自訂中的「主項目」(Host Item) 或「主控制項」(Host Control)。主項目和主控制項是 Visual Studio Tools for Office Runtime 提供的型別,這些型別可將功能加入至原本就存在於 Word 或 Excel 物件模型的物件,稱為「原生 Office 物件」(Native Office Object)。通常,主項目和主控制項也稱為 擴充物件。如需主項目和主控制項的詳細資訊,請參閱 主項目和主控制項概觀。
了解 GetVstoObject 和 HasVstoObject 方法
若要測試原生 Office 物件,請在專案中使用 HasVstoObject 和 GetVstoObject 方法:
如果您想要判斷自訂中是否有原生 Office 物件的擴充物件,請使用 HasVstoObject 方法。如果原生 Office 物件具有擴充物件,這個方法會傳回 true,否則傳回 false。
如果您想要取得原生 Office 物件的擴充物件,請使用 GetVstoObject 方法。如果指定的原生 Office 物件具有擴充物件,這個方法會傳回 Microsoft.Office.Tools.Excel.ListObject、Microsoft.Office.Tools.Excel.Workbook、Microsoft.Office.Tools.Excel.Worksheet 或 Microsoft.Office.Tools.Word.Document 物件。否則,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) 要測試。