Smart Documents(智慧文件) 是 Microsoft Office 2003 (Word/Excel) 引入的可程式化文件技術。開發者可將XML 結構定義 (XSD)、動作處理常式 (Action Handler DLL)、擴充套件清單 封裝進文件,當使用者開啟文件時,Office 會自動下載安裝元件,並在工作窗格呈現情境感知的 UI 控制項(表單、說明、驗證、路由按鈕等),輔助使用者完成業務流程。
ISmartDocument OLE 介面的 COM 元件(VB6、VB.NET、C#、C++),提供動態 UI、驗證邏輯、外部系統整合。ISmartDocument::GetPaneInfo、GetControls、OnControlEvent 等方法。<xs:schema xmlns:xs="https://www.w3.org/2001/XMLSchema"
targetNamespace="urn:project-schedule"
xmlns="urn:project-schedule">
<xs:element name="Project">
<xs:complexType>
<xs:sequence>
<xs:element name="ProjectName" type="xs:string"/>
<xs:element name="DeveloperName" type="xs:string"/>
<xs:element name="Task" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="xs:string"/>
<xs:element name="EstimatedHours" type="xs:decimal"/>
<xs:element name="Completed" type="xs:boolean"/>
<xs:element name="NextWeekPlan" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
ProjectName 拖至 A2、DeveloperName 拖至 B2。Task 重複元素,拖至標題列 (A5),Excel 自動建立 XML 表格 (ListObject),新增列即自動擴展。// ISmartDocument 介面核心方法
HRESULT GetPaneInfo(BSTR *paneTitle, BSTR *paneDesc) {
*paneTitle = SysAllocString(L"專案進度助手");
*paneDesc = SysAllocString(L"協助填寫每週進度並生成 Word 報告");
return S_OK;
}
HRESULT GetControls(BSTR xmlNodeName, ISmartDocumentControls **controls) {
if (wcscmp(xmlNodeName, L"Task") == 0) {
// 為每個 Task 列動態建立控制項:下拉選單(狀態)、文字方塊(下週計畫)、按鈕(生成報告)
// 綁定 OnControlEvent 處理按鈕點擊
}
return S_OK;
}
HRESULT OnControlEvent(BSTR controlId, BSTR eventName, VARIANT *arg) {
if (wcscmp(controlId, L"btnGenerateReport") == 0 && wcscmp(eventName, L"Click") == 0) {
// 1. 讀取 XML 表格資料 (XPath 或 OM)
// 2. 組裝 XML 狀態摘要
// 3. 呼叫 Word Automation 或 XSLT 轉換生成 .docx
// 4. 提示使用者儲存/寄送
}
return S_OK;
}
=IF(WEEKDAY(TODAY(),3)<2, TODAY()-(7+WEEKDAY(TODAY(),3)), TODAY()-WEEKDAY(TODAY(),3))
直接在儲存格計算,無需 DLL 介入,展示「善用 Office 內建能力」原則。
完整範例 (SmartDocuments.exe):Microsoft 官方下載
第二部分將深入 ISmartDocument 介面完整定義、C# 實作範本、XSLT 轉換 Word 文件、除錯技巧與群組原則部署自動化。