智能文檔是微軟Word 2003和Excel 2003中新的可編程特性。開發者可以建立用可編程代碼片段增強了的Word或Excel智能文檔,以輔助用戶建立和修改它們。重復使用模版內容、為如何格式化或完成文檔實現業務規則、通過正式批准的過程路由(routing)文檔等等過程,Office智能文檔都可以簡化。
多年以來利用ActiveX和Visual Basic for Applications (VBA)在自定義的解決方案中使用微軟Office應用程序是可行的。但是它們有一些限制,特別是在布署、用戶界面和安全性方面。智能文檔把Office XP引入的流行的“任務面板”接口和自定義解決方案之間緊密集成,從而解決了這些問題。有了智能文檔,你就能用XML定義自定義事務面板內容,它能把幫助、指令和可編程控件自動地與用戶在文檔中的位置同步。自定義事務面板控件的代碼可以使用多種語言開發:Visual Basic 6.0、Visual Basic .Net、Visual C++或Visual C#。
當用戶簡單地打開來自可信服務器的文檔或電子郵件中的附件的時候,智能文檔和相關的組件就會被安裝。它們可以自動從可信的服務器上更新自身,極大的簡化了更新的布署。智能文檔遵循Office安全性設置,要求它們下載自可信服務器並有可信源的簽名。你可以為用戶提供一個控件以決定是否打開不符合執行安全性標准智能文檔
盡管目前有很多好的跟蹤進度表的解決方案,但是我還是把這種進度表作為存儲在Excel中的數據庫,因為我希望你簡單地安裝Office 2003並下載本文的代碼後,不需要安裝其它的任何附加產品就能使用這個解決方案。
在電子表格中每個包含有用信息的進度表數據項都有一行記錄:誰在做這個事務、估計完成這個事務需要的時間總計、這個事務是否已經完成。我假定在項目小組,開發者每周更新這個進度表以反映上一周的工作情況。此外,由於我希望知道小組正在進行什麼事務,我將要求他們確定下一周將做什麼事務。這也是對進度估計什麼時候進行修改的時間。我建立的智能文檔解決方案能把所有這些進度改變包裝為良好格式化的Word狀態文檔——這恰好是經理們喜歡的。作為附帶的優點,我將給狀態文檔使用Word的新的XML特性。實際上,我的Excel智能文檔解決方案將生成一個XML狀態摘要,我將在Word中把這個摘要與XSLT結合起來以得到良好格式化的文檔。
智能文檔的概念 在Office 2003智能文檔解決方案中有五個主要的部分。首先,要有Word文檔或Excel模版。它是用戶打開以執行業務功能的智能文檔——在例子中為每個軟件項目生成了一個良好格式化的每周狀態報告。請注意,在Office 2003中,只有Word和Excel支持智能文檔。
其次,要有XML大綱定義(XSD)。Word文檔或Excel電子表格都使用來自XML大綱的元素作記號,用於覆蓋全部或部分文檔或工作簿上面的XML數據模型。例如,在項目進度工作簿中,有一個項目名稱(Project Name)單元和一個開發者姓名(Developer Name)單元。它們分別與XML大綱中的ProjectName和DeveloperName元素對應。“做標記”就是工作簿開發者如何把這些特定單元與XML大綱元素關聯。
第三,你要有操作處理程序(action handler)DLL,可以在Visual Basic、Visual Basic .Net、Visual C++或Visual C#中開發它。接著把它被布署到Web或網絡服務器上。這個DLL實現了ISmartDocument OLE接口。
第四,要有說明解決方案安裝指令的XML擴展包清單文件。它提供了解決方案DLL的服務器位置和解決方案的COM CLSID。同時它還記載了其它一些與解決方案關聯的文件和解決方案的ID。解決方案的ID唯一地標識了該智能文檔解決方案。盡管你可以把任何唯一的標識符字符串作為解決方案的ID,但是最好使用生成的GUID。
最後,要有你希望安裝到本地計算機的解決方案需要的其它文件(例如GIF或JPEG、Html或文檔片段)。這些都必須在清單文件中指定,當打開智能文檔的時候被Office自動地安裝或更新。這樣它們才能被智能文檔解決方案的代碼使用。
我要闡明一下示例中每個文檔的角色,智能文檔是附帶了XML大綱和自定義邏輯的文檔——在示例中,它是Excel電子表格。我生成Word文檔這個事件是偶然的,我也能輕易的把信息放入數據庫中或生成一個PowerPoint演示文稿。
你可以考慮一下XML元素,它們把電子表格或文檔分解為邏輯結構的組件,就像鉤子一樣,智能文檔解決方案能夠在文檔的不同部分中附加控件以輔助用戶工作的。這些控件的行為是在運行的時候由你的操作處理程序DLL定義的。這些控件實際上變成了一個完善的內容敏感的(context-sensitive)幫助系統,當用戶移動進入文檔或電子表格的特定部分(與XML元素對應)的時候,它們顯示在新文檔的操作事務面板中。因為智能文檔控件不僅僅是幫助文本,所以你的內容敏感幫助實際上作為用戶的助手,幫助用戶完成使用該文檔的業務事務系統。
建立智能文檔 生成智能文檔解決方案的涉及到的大多數工作包括建立一個Word或Excel文檔,並把XML元素與它關聯。實際上,你一般可以把已有的Word或Excel文檔作為建立智能文檔的基礎。因為多數業務文檔已經有了一定的結構,當你定義XML元素的時候僅僅需要對它進行形式化(formalize)和命名。
從開發者的角度看,該文檔或電子表格是解決方案的基本UI。當用戶編輯的時候,智能文檔操作處理程序DLL定義了出現在該文檔旁邊的附加的UI。在可能的情況下,在建立智能文檔的時候使用Word和Excel的下層能力,而不是在智能文檔DLL中編寫自定義代碼是明智的。我的Excel進度表工作薄中的公式就演示了這一點。我希望在上一周的星期一得到狀態報告,但是人們通常在星期一或星期四添加狀態報告;在這以後是本周的星期一了。我不是編寫一段C++代碼實現這種操作,而是編寫了Excel公式來壓縮這個計算過程並把它放在工作表的一個單元中:
=IF(WEEKDAY(TODAY(),3)<2,
TODAY()-(7+WEEKDAY(TODAY(),3)),
TODAY()-WEEKDAY(TODAY(),3))
我簡單地使用一個自己編寫的從Excel工作薄中得到值的函數從該工作表單元中載入計算過的日期值。
開始 現在我們從建立一個Excel電子表格以跟蹤軟件進度表開始。注意,我假定你已經下載了示例代碼,它包含了必要的支持文件。
啟動微軟Excel 2003並打開Project Schedule (Original).xls。這個電子表格與大多數Excel電子表格一樣,已經有了一個結構。現在使用XSD文檔(例子中是ScheduleSmartDocument.xsd)把一個XML大綱與這個結構關聯。在Excel中,點擊“數據”菜單下的“XML”並選擇“XML源”。當“XML源”事務面板出現的時候,點擊“工作薄映射”按鈕並添加ScheduleSmartDocument.xsd文件。接著點擊“確定”關閉“浏覽”對話框,再次點擊“確定”關閉“XML映射”對話框。圖1顯示了添加大綱後的Excel“XML源”事務面板。
圖1.XML源為了建立映射,你必須把元素從XML大綱中拖到工作薄上。對於類似Project Name和Developer的元素,這是很簡單的事情,只需要把該XML元素名稱從“XML源”事務面板上拖動到包含相關數據的工作薄單元上(例如,把ProjectName拖動到A2上)。對於分層顯示的重復的進度表數據項,可以通過選擇數據項把該組拖動到標題行(A5)上。你可以通過選擇“XML源”事務面板中特定的元素(例如Description)來確認映射關系;工作薄中相應的部分應該高亮度顯示。把結果工作薄保存為Project Schedule (Mapped).xls。在示例中,我將建立單個電子表格,或者你可以把進度表保存為Excel工作薄模版。這樣的話,你就簡化了用戶建立該文檔的新副本的過程,每個新的副本都將成為一個Excel智能文檔。【未完待續】