過去我曾介紹過在 BDS 2006 環境下,以「由外而內」方式開發 Interop 程式的常規步驟:啟動 Excel 應用程式物件,取得 Workbook、Worksheet、Cells 等介面參考並進行操作。今天要分享一種全新的開發模式——「由內而外」:讓 Excel 工作簿主動載入並呼叫我們開發的 .NET 組件,實現更緊密的整合體驗。
本範例使用免費的 C# IDE SharpDevelop(可自官網免費下載),作業系統為 Vista Business(XP 同樣適用),Office 版本為 2003。安裝 Office 時務必勾選各應用程式(Word、Excel 等)的 .NET 程式設計支援(PIA),否則無法參考 Interop 組件。
Microsoft.Office.Interop.Excel(注意:必須使用 GAC 版本,而非 COM 索引標籤)。MyClass.cs,加入必要的命名空間與組件屬性:using System;
using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;
[assembly: System.ComponentModel.DescriptionAttribute(
"OfficeStartupClass, Version=1.0, Class=TestOLE.MyClass")]
Class=TestOLE.MyClass 需對應專案的命名空間與類別名稱。
MyClass 中實作 Excel 要求的兩個特定方法 _Startup 與 _Shutdown:public Excel.Application MyApp;
public Excel.Workbook MyWorkBook;
public Excel.Worksheet MyWorksheet;
public void _Startup(object thisApp, object thisWorkbook)
{
this.MyApp = thisApp as Excel.Application;
this.MyWorkBook = thisWorkbook as Excel.Workbook;
this.MyWorksheet = MyWorkBook.Worksheets[1] as Excel.Worksheet;
MyWorksheet.Cells[1, 1] = "The add-on starts!";
}
public void _Shutdown()
{
MyApp = null;
MyWorkBook = null;
MyWorksheet = null;
}
編譯專案即可產生 MyClass.dll。
雖然開發環境為 .NET 2.0/3.0,但產出的 DLL 安全性必須在 .NET 1.x 的原則下配置(如 caspol.exe 設定信任),詳細步驟請參考相關文件。
D:\Go4Pro Programs\00017\bin\Debug)。TestOLE)。儲存並重新開啟工作簿,若 A1 顯示 The add-on starts! 即代表增益集已成功載入並執行。
為了讓使用者能在工作簿中直接操控行為,我們利用 SheetFollowHyperlink 事件配合超連結來呼叫增益集方法。
MyClass 中新增事件處理與業務邏輯:private Excel.WorkbookEvents_SheetFollowHyperlinkEventHandler followHyperlinksEvent;
public void _Startup(object thisApp, object thisWorkbook)
{
// ... 前略 ...
followHyperlinksEvent = new Excel.WorkbookEvents_SheetFollowHyperlinkEventHandler(
ThisWorkbook_SheetFollowHyperlink);
MyWorkBook.SheetFollowHyperlink += followHyperlinksEvent;
}
protected void ThisWorkbook_SheetFollowHyperlink(System.Object s, Excel.Hyperlink l)
{
switch (l.SubAddress)
{
case "ChangeTitle":
ChangeTitle();
break;
default:
break;
}
}
public void ChangeTitle()
{
MyApp.Caption = "Invoked from Excel (supported by C#)";
}
Click here to change the title!)。ChangeTitle(須與 case 字串完全一致)。ChangeTitle。儲存並重新開啟,點擊該儲存格即可看到 Excel 視窗標題被 C# 程式碼修改。
| 面向 | 傳統「由外而內」 | 增益集「由內而外」 |
|---|---|---|
| 操作介面 | 需在自訂程式與 Excel 之間切換 | 完全在 Excel 介面內操作 |
| 生命週期 | 需手動關閉主程式 | 關閉工作簿即自動卸載 DLL |
| 部署門檻 | 較低 | 需設定 .NET 1.x 安全性,較高 |
孰優孰劣,端視專案需求與使用者技術能力而定。