首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

使用 C++ 與 XML 建立智慧文件:Office 2003 Smart Documents 開發指南 (一)

     編輯:MySQL 資料庫相關知識

什麼是智慧文件?

Smart Documents(智慧文件) 是 Microsoft Office 2003 (Word/Excel) 引入的可程式化文件技術。開發者可將XML 結構定義 (XSD)、動作處理常式 (Action Handler DLL)、擴充套件清單 封裝進文件,當使用者開啟文件時,Office 會自動下載安裝元件,並在工作窗格呈現情境感知的 UI 控制項(表單、說明、驗證、路由按鈕等),輔助使用者完成業務流程。

五大核心組件

  1. 文件範本:.dot (Word) 或 .xlt (Excel),預置版面、樣式、預設內容。
  2. XML Schema Definition (XSD):定義文件資料模型的元素、型別、約束;文件內容透過「標記」對應至 Schema 元素。
  3. Action Handler DLL (ISmartDocument):實作 ISmartDocument OLE 介面的 COM 元件(VB6、VB.NET、C#、C++),提供動態 UI、驗證邏輯、外部系統整合。
  4. 擴充套件清單:XML 檔,記載 Solution ID (GUID)、DLL 下載 URL、版本、相依檔案(圖片、HTML 片段等)。
  5. 相依資源:清單中列舉的輔助檔案,隨文件開啟自動快取至本機。

開發流程概覽

  1. 設計業務文件結構 → 產出 XSD。
  2. 建立 Word/Excel 範本,使用「XML 來源」工作窗格將 XSD 元素拖曳對應至文件位置(標記)。
  3. 開發 Action Handler DLL,實作 ISmartDocument::GetPaneInfo、GetControls、OnControlEvent 等方法。
  4. 簽署 DLL(Authenticode),部署至受信任 HTTPS 伺服器。
  5. 撰寫擴充套件清單,指向 DLL URL 與 Solution ID。
  6. 將清單 URL 內嵌至文件屬性或透過群組原則部署。
  7. 測試:開啟文件 → Office 偵測清單 → 下載驗證 DLL → 載入工作窗格 → 互動驗證。

範例:Excel 專案進度表 → Word 狀態報告自動生成

資料模型 (XSD 片段)

<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>

Excel 標記操作

  • 開啟 資料 → XML → XML 來源 → XML 對應 → 加入 XSD。
  • 將 ProjectName 拖至 A2、DeveloperName 拖至 B2。
  • 選取 Task 重複元素,拖至標題列 (A5),Excel 自動建立 XML 表格 (ListObject),新增列即自動擴展。

Action Handler 關鍵邏輯 (C++ 伪碼)

// 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;
}

Excel 公式輔助:自動計算「上週一」日期

=IF(WEEKDAY(TODAY(),3)<2, TODAY()-(7+WEEKDAY(TODAY(),3)), TODAY()-WEEKDAY(TODAY(),3))

直接在儲存格計算,無需 DLL 介入,展示「善用 Office 內建能力」原則。

部署與安全

  • DLL 必須強名稱簽章並由受信任發行者簽署;Office 依安全性設定決定是否載入。
  • 清單與 DLL 置於 HTTPS 伺服器,支援自動更新(版本號遞增)。
  • 使用者可在 信任中心 → 隱私權選項 控制是否允許智慧文件下載元件。

程式碼下載

完整範例 (SmartDocuments.exe):Microsoft 官方下載

下集預告

第二部分將深入 ISmartDocument 介面完整定義、C# 實作範本、XSLT 轉換 Word 文件、除錯技巧與群組原則部署自動化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved