程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Office開發: 使用文檔信息面板管理元數據

Office開發: 使用文檔信息面板管理元數據

編輯:關於.NET

本文討論:

文檔信息面板

維護元數據

使用 InfoPath 窗體

本文使用了以 下技術:

2007Office 系統,.NET Framework 3.5

現在,每個組織都面臨著嚴峻的信息管理 挑戰。由於重要的信息以多種不同的格式存儲在分散的位置,因此人們很難輕松地找出和使用這些數據。 除了能夠簡單地查找和使用數據外,公司還必須就數據保留和政府循規性制定相應的策略。

為滿足這些新興的需求並實現由信息驅動的應用程序,必須為文檔賦予適當的元數據屬性,並且元數 據應該在企業的所有系統中都可以使用。在本文中,我將說明如何使用文檔信息面板啟用有效的元數據和 內容管理,文檔信息面板是 Microsoft® Word 2007、Excel® 2007 和 PowerPoint® 2007 中提供的一種基於窗體的組件,它允許用戶管理文檔級別的元數據。

使用文檔信息面板管理元數 據

Microsoft Office 平台始終允許您同時維護文檔的標准屬性和自定義屬性。但是,文檔信息面 板可以讓您實現更多的功能,例如基於元數據的搜索和信息驅動業務流程的自動化。使用文檔信息面板, 用戶可以在下列四類文檔屬性中實現特定文檔的元數據:核心或標准屬性、自定義文檔屬性、Microsoft Office SharePoint® Server (MOSS) 2007 的內容類型以及擴展和高級自定義屬性。接下來讓我們分 別進行探討。

核心屬性 用戶可以使用文檔信息面板的標准文檔屬性視圖來管理所有 Office 文檔 共用的核心文檔屬性(作者、標題、主題、關鍵字、類型、狀態和注釋等)。

自定義文檔屬性 為 了向 Office 文檔中添加更多的業務上下文,2007 Microsoft Office 系統允許您附加可信的自定義 InfoPath® 窗體模板作為自定義文檔信息面板。圖 1 顯示了被我稱為 ChecklistMetadata 的 InfoPath 窗體模板——我將在稍後進行介紹。它作為自定義文檔信息面板附加到 Word 2007 文檔中。

Figure 1 InfoPath Form Template Attached to a Word 2007 Document

SharePoint Server 2007 的內容類型 存儲在 MOSS 2007 文檔庫中的文檔都包含自定義文檔屬性,這 些屬性被映射到為關聯的 SharePoint 站點所定義的內容類型中。這些文檔會自動顯示內容類型的字段, 並將其作為自定義文檔信息面板。用戶在脫機/聯機模式下都可以更新內容類型字段值,當用戶連接到文 檔庫時,這些值會自動保存回文檔庫中。

有關 MOSS 2007 文檔的自定義文檔信息面板的詳細信息 ,您可以訪問 go.microsoft.com/fwlink/?LinkId=109825。

擴展和高級自定義屬性 通過在文檔 信息面板的“Advanced Properties”(高級屬性)選項中訪問文檔屬性窗口(如圖 2 所示) ,用戶可以訪問並管理附加的特定於文檔的自定義屬性。在這一對話框中,用戶可以使用 “Summary”(摘要)選項卡填充擴展屬性,並可使用“Custom”(自定義)選項 卡創建新的自定義屬性。為了獲得更加豐富的元數據管理能力,可以對文檔信息面板進行配置,使其通過 InfoPath 窗體來顯示並管理文檔元數據。

Figure 2 Advanced Properties Menu

利用 2007 Office 系統中的“Developer”(開發人員)選項卡,您可以使用代碼、控件 、自定義的 XML 和模板來自定義文檔——還可以在其中啟用文檔信息面板。圖 3 顯示了 Word 2007 文檔中突出顯示的“Document Panel”(文檔面板)選項。要在 Office 2007 文 檔中顯示和配置文檔信息面板,請單擊“Document Panel”(文檔面板)選項。

Figure 3 Document Panel Option for a Word 2007 Document

如果想要附加自定義文檔信息面板,可使用網絡路徑或 InfoPath 窗體模板的 URL 來指定自定義模板 。請注意,如果只想查看標准文檔屬性,則此時無需指定自定義模板。

然後,選擇“Standard Properties”(標准屬性)或“Custom Properties”(自定義屬性)選項( 僅當附加自定義 InfoPath 窗體模板時)作為文檔信息面板的“默認顯示”。當 InfoPath 窗體模板中存 在多個可用視圖時,默認視圖將顯示為可以訪問其他視圖的自定義文檔信息面板。

有效元數據管理的重要要求之一是在應用程序間保持一致的元數據架構。文檔信息面板有利於一致性 和重用——相同的 InfoPath 2007 模板也可以作為自定義文檔信息面板附加到 Word、Excel 和 PowerPoint 2007 文檔中。

您或許知道,2007 Office 系統文檔均基於 Open XML 格式。因此,它們都由 .zip 文件包組成,其 中包含存儲著文檔相關內容和元數據的 XML 文件。同樣,在文件包內部,文檔屬性被存儲為 XML。由於 所有信息都存儲為 XML,因此可以非常簡單地通過編程方式訪問這些信息以自動化元數據驅動的業務流程 。我將在下面的章節中解釋其工作原理。

文檔屬性管理

標准文檔屬性可以通過文檔信息面板的文檔屬性視圖進行維護。要查看這些屬性在 OpenXML 包中的實 際存儲位置,可解壓縮 Office 文檔,然後打開 _rels 文件夾中的 .rels 文件。如您在圖 4 中所見, 此文件顯示出標准文檔屬性(核心屬性)被存儲在 docProps 文件夾下的 core.xml 文件中。core.xml 文件包含所有標准文檔屬性,這些屬性由文檔信息面板中的文檔屬性視圖填充。

Figure 4 關系文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships
  xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
 <Relationship Id="rId3"
  Type="http://schemas.openxmlformats.org/officeDocument/2006/
  relationships/extended-properties" Target="docProps/app.xml"/>
 <Relationship Id="rId2"
  Type="http://schemas.openxmlformats.org/package/2006/
  relationships/metadata/core-properties" Target="docProps/core.xml"/>
 <Relationship Id="rId1"
  Type="http://schemas.openxmlformats.org/officeDocument/2006/
  relationships/officeDocument" Target="word/document.xml"/>
 <Relationship Id="rId4"
  Type="http://schemas.openxmlformats.org/officeDocument/2006/
  relationships/custom-properties" Target="docProps/custom.xml"/>
</Relationships>

圖 5 中的代碼說明了如何獲取標准文檔屬性值,以及如何使用 Word 對象模型的 DocumentProperties 對象將其設置為新值。Word 文檔對象的 BuiltInDocumentProperties 屬性將返回 一個 DocumentProperties 對象,此對象是標准 DocumentProperty 對象的集合。然後,可通過指定屬性 名稱(在本例中為類別屬性)使用 Item 屬性檢索特定的 DocumentProperty 對象。DocumentProperty 對象的 Value 屬性用來設置或獲取該屬性的值。

Figure 5 獲取標准文檔屬性

Dim StandardProperties As Microsoft.Office.Core.DocumentProperties
Dim StandardProperty As Microsoft.Office.Core.DocumentProperty
Dim Category As String
'Assign Current Document Standard Properties
StandardProperties = _
 DirectCast(Globals.ThisDocument.BuiltInDocumentProperties, _
 Microsoft.Office.Core.DocumentProperties)
'Assign "category" property
StandardProperty = StandardProperties.Item("category")
'Get "category" property value
Category = StandardProperty.Value
'Set "category" property value to "Modified Checklist"
StandardProperty.Value = "Modified Checklist"

利用 Word 對象模型,也可以使用 CustomXMLParts 對象訪問這些 XML 文檔格式的屬性(請參見圖 6 )。CustomXMLParts 對象返回 CustomXMLPart 對象的集合,其中包含描述該文檔的 XML 文件。集合中 的第一個 XML 文件是 core.xml 文件,它包含標准文檔屬性。獲取了對 XMLDocument 對象的引用後,即 可使用 XPath 查詢方法(例如,SelectSingleNode)來操作節點(例如,類別屬性節點)。

Figure 6 訪問 XML 格式的屬性

Dim OfficeCustomXMLParts As Microsoft.Office.Core.CustomXMLParts
Dim Category As String
'Assign CustomXMLParts containing standard/core
'document properties XML Part
OfficeCustomXMLParts = DirectCast(Globals.ThisDocument.CustomXMLParts, _
 Microsoft.Office.Core.CustomXMLParts)
'Find the "category" property node and get the value of "category"
'standard property
Category = OfficeCustomXMLParts.Item(1).SelectSingleNode _
("//*[local-name(.)='category']").Text
'Find the "category" property node and set the value of "category"
' standard property
OfficeCustomXMLParts.Item(1).SelectSingleNode _
("//*[local-name(.)='category']").Text = "modified category"

自定義文檔屬性管理

自定義文檔屬性可通過 InfoPath 窗體模板進行維護,該模板作為自定義文檔信息面板被附加到文檔 。InfoPath 窗體數據存儲在文檔內部作為自定義 XML 文檔部件。請注意,文檔中包括的所有自定義 XML 部件的關系都是在 Word/_rels 文件夾中的 document.xml.rels 文件中定義的。自定義 XML 文件本身位 於 customXml 文件夾中。每個自定義 XML 文檔部件都包含其自身的關系定義文件,這些文件存儲在 customXml/_rels 子文件夾中。如下所示,item1.xml 部件包含相應的 item1.xml.rels 文件,該文件指 向 itemProps1.xml 文件,並指出此 XML 部件中存有描述 item1.xml 的自定義屬性:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Relationships
 xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
 <Relationship Id="rId1"
  Type="http://schemas.openxmlformats.org/officeDocument/2006/
  relationships/customXmlProps" Target="itemProps1.xml" />
</Relationships>

itemProps1.xml 文件隨後通過架構引用指明自定義 XML 架構是 InfoPath 架構。這將允許 Word 將 item1.xml 作為 InfoPath 窗體打開:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ds:datastoreItem ds:itemID="{A9851B97-75EE-4C97-ACC6-D9EB7DA1D3DC}"
 xmlns:ds="http://schemas.openxmlformats.org/officeDocument/
 2006/customXml">
 <ds:schemaRefs>
  <ds:schemaRef ds:uri="http://schemas.microsoft.com/office/
   infopath/2003/myXSD/2007-09-01T16:03:56" />
  <ds:schemaRef ds:uri="http://schemas.microsoft.com/
   office/infopath/2003" />
 </ds:schemaRefs>
</ds:datastoreItem>

要想指出自定義 XML 屬性在附加時應作為自定義文檔信息面板,只需通過構架引用指明此關系即可:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ds:datastoreItem ds:itemID="{B97FA79B-5941-4441-9A4B-3E001C0278D6}"
  xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/
 customXml">
 <ds:schemaRefs>
  <ds:schemaRef ds:uri="http://schemas.microsoft.com/office/2006/
  customDocumentInformationPanel" />
 </ds:schemaRefs>
</ds:datastoreItem>

現在,如果打開此項,它將指出 InfoPath 被用作自定義 XML 屬性編輯器,而 ChecklistMetadata.xsn 文件被作為 InfoPath 窗體模板附加到自定義文檔信息面板中。要訪問附加的 InfoPath 窗體 XML 文件,可以使用 CustomXMLParts 對象,就像以前訪問標准文檔屬性那樣。

下面的代碼說明了如何使用 CustomXMLParts 對象和 SelectSingleNode 方法來檢索 CL—Business— Information Technology 類別檢查表中 InfoPath 窗體字段的 ProjectName 節點:

Dim InfoPathXML As XmlDocument = New XmlDocument()
Dim projectname As String
'Load InfoPath Form XML
InfoPathXML.LoadXml(Globals.ThisDocument.CustomXMLParts.Item(4).XML)
'Get the "Project Name" field value of the
'  CL - Business - Information Technology checklist metadata
projectname = InfoPathXML.SelectSingleNode _
("//*[local-name(.)='ProjectName']").InnerText

附加的自定義屬性可通過文檔信息面板中的“Advanced Properties”(高級屬性)視圖進行維護。您 可以通過查看根 _rels 文件夾中的 .rels 文件來確定這些屬性在文檔包中的存儲位置。如您所見,關系 文件表明自定義文檔屬性存儲在 docProps 文件夾中名為 custom.xml 的文件內。

為便於演示,我已事先使用“Advanced Properties”(高級屬性)對話框將 Client 作為 自定義屬性添加到了文檔中。如下面的代碼所示,Client 屬性存儲在 docProps/custom.xml 文件中:

<?xml version="1.0" encoding="UTF-8" 

standalone="yes" ?>
<Properties xmlns="http://schemas.openxmlformats.org/
 officeDocument/2006/
 custom-properties"
 xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/
 docPropsVTypes">
 <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
  pid="2" name="Client">
  <vt:lpwstr>
   Client Value
  </vt:lpwstr>
 </property>
</Properties>

圖 7 中的代碼說明了如何通過編程方式獲得 Client 自定義屬性值,並 使用 Word 對象模型將其設置為新值。如圖所示,Word 文檔對象的 CustomDocumentProperties 屬性將 返回一個自定義 DocumentProperty 對象的集合。然後,可通過指定屬性名稱(在本例中為 Client 屬性 )使用 Item 屬性檢索特定的 DocumentProperty 對象。DocumentProperty 對象的 Value 屬性用來設置 或獲取自定義文檔屬性的值。

Figure 7 獲取 Client 自定義屬性

Dim CustomProperties As Microsoft.Office.Core.DocumentProperties
Dim CustomProperty As Microsoft.Office.Core.DocumentProperty
Dim client As String
'Assign Current Document Standard Properties
CustomProperties = DirectCast(Globals.ThisDocument.CustomDocumentProperties, 

Microsoft.Office.Core.DocumentProperties)
'Assign "client" property
CustomProperty = CustomProperties.Item("Client")
'Get "client" property value
client = CustomProperty.Value
'Set "client" property value to "Microsoft"
CustomProperty.Value = "Microsoft"

以下代碼顯示如何添加新的自定義屬性 Checklistversion 並將其值設置為 1:

Dim CustomProperties As 

Microsoft.Office.Core.DocumentProperties
'Assign Current Document Standard Properties
CustomProperties = _
 DirectCast(Globals.ThisDocument.CustomDocumentProperties, _
 Microsoft.Office.Core.DocumentProperties)
'Add "ChecklistVersion" as a custom property and set value to "1.1"
CustomProperties.Add("ChecklistVersion", False, _
 Microsoft.Office.Core.MsoDocProperties.msoPropertyTypeNumber, "1.1").

如 您所見,CustomDocumentProperties 對象的 Add 方法用來添加新的自定義文檔屬性並將其值設置為 1.1 。而且雖然該值已作為字符串被添加進來,但 msoPropertyTypeNumber 指定應將該字符串視為數字。

到目前為止,您已經知道了文檔信息面板允許用戶和系統管理員將元數據作為獨立的文檔部件存 儲在 OpenXML 文檔包中,從而可以更有效地管理和維護元數據。但是,有效的元數據驅動業務流程實現 僅當元數據值可用於自動化業務流程、控制內容環境以及幫助用戶自動生成可重復內容時才會成為可能。

接下來,我將開發基於 Word 2007 的檢查表管理應用程序,以演示如何通過將標准文檔屬性和基 於 InfoPath 窗體的自定義字段與其他 Word 2007 組件(如內容控件、Quick Parts/構造塊以及自定義 的 Fluent Ribbon 控件)相關聯來自動化業務流程。

要使用 Word 2007 自動化檢查表管理,首 先必須開發並發布 InfoPath 窗體模板 ChecklistMetadata.xsn,表明檢查表元數據將作為自定義文檔信 息面板附加到 Word 2007 文檔中。然後,在 Visual Studio® 中創建一個 Word 2007 文檔項目,並 將 ChecklistMetadata.xsn 窗體模板作為自定義文檔信息面板附加到該文檔中。接下來,創建一個自定 義功能區控件,用於顯示和隱藏文檔信息面板。

然後再開發一個 Word 2007 模板 ChecklistsQuickPartsTemplate.dotm,其中包含被分類為自定義 Quick Part 的不同檢查表,並將其分 配到用戶應用程序數據文件夾以便與 Word 2007 文檔集成。隨後,即可實現一個自定義功能區控件,並 通過編程方式將檢查表 Quick Part 作為構造塊插入到來自附加的 ChecklistsQuickPartsTemplate.dotm 模板的文檔中。根據在自定義文檔信息面板中選定的檢查表類別插入檢查表 Quick Part。

然後, 使用 Word 2007 內容控件通過編程方式將標准文檔屬性和 InfoPath 窗體字段(使用自定義文檔信息面 板顯示)綁定到文檔本身。現在,我將為您介紹用戶如何手動將標准和擴展文檔屬性作為 Quick Part 添 加到文檔中。

InfoPath 窗體模板

每個檢查表都可以包含常見的、特定於檢查表的元數據。我將要開發的 InfoPath 窗體模板將定義一 個作為示例的通用的、特定於檢查表的元數據。

首先,在設計階段,我在 InfoPath 窗體模板中定義下列檢查表類別。它們如圖 8 所示。為了便於說 明,我只定義了兩種類型的主要類別:Business 和 Personal。我還為這兩種類別定義並開發了元數據部 分:Business—Information Technology 和 Personal—Hospital 類別。

Figure 8 Sample Checklist Categories

為 Business—Information Technology 類別添加的元數據包括 Project Name、Purpose 和 Team Members(它們都是多行文本框,如圖 9 所示)。此外還有 Project Number 和 Technology Used(單行 文本框),而 Start Date 和 End Date 則作為日期選取器。類似地,圖 10 顯示了 Personal— Hospital 類別的元數據顯示方式。

Figure 9 Business—Information Technology Metadata(單擊該圖像獲得較大視圖)

Figure 10 Personal—Hospital Metadata

根據所選的元數據類別,相關的元數據部分將顯示出來。此功能允許各個類別部分使用 InfoPath 的 條件格式化功能。出於安全考慮,在把 InfoPath 窗體模板作為自定義文檔信息面板附加到文檔之前,必 須先將其發布或安裝到本地 intranet 或可信站點。

在發布 InfoPath 窗體模板之前,先使用“Tools”(工具)|“Form Options”(窗體選項)| “Security and Trust”(安全和信任)選項(圖 11)來設定適當的安全設置。模板發布到可信位置後 ,將其作為自定義文檔信息面板附加到文檔中。

Figure 11 Security and Trust Settings

為維護高級別的安全性,可以使用由正式的第三方證書提供商提供的證書對 InfoPath 窗體模板進行 數字簽名並將其發布到可信位置,例如 MOSS 文檔庫或窗體服務器。

雖然仍處在開發階段,但使用自簽名證書對 InfoPath 窗體模板進行簽名並將其發布到本地計算機可 減少很多麻煩。有關此過程的更多信息,請訪問 go.microsoft.com/fwlink/?LinkId=109827。

創建了 InfoPath 窗體模板後,您可以在 Visual Studio 2008 中創建新的 Word 2007 文檔項目。在 設計時,將 ChecklistMetadata.xsn 文件作為自定義文檔信息面板附加到文檔,並選擇自定義視圖作為 默認視圖。InfoPath 窗體視圖、檢查表元數據應作為自定義文檔信息模板顯示在文檔中。

您可以通過將檢查表類別改為 CL—Business—Information Technology 和 CL—Personal—Hospital 來確認 InfoPath 窗體模板工作是否正常。您應查看文檔信息面板中顯示的相應元數據部分。

顯示或隱藏文檔信息面板

在處理文檔時,為了能夠獲得更多的可用顯示區域,有時用戶希望將文檔信息面板隱藏起來。Office 對象模型允許通過編程方式來控制文檔信息面板的可見性,下面我將介紹如何通過創建自定義的功能區控 件來顯示或隱藏文檔信息面板。

從新項目對話框中選擇“Ribbon”(功能區)(可視化設計器)選項,為項目添加一個功能區。將功 能區命名為 CustomizeChecklistRibbon。添加一個名為 ShowHideDIP 的按鈕控件,它將被用來顯示或隱 藏文檔信息面板(請參見圖 12)。

Figure 12 Show or Hide Document Information Panel

以下代碼演示了如何通過編程方式來顯示或隱藏文檔信息面板。將這些代碼添加到 ShowHideDIP 按鈕 的單擊事件處理程序中:

'Check if Document Information Panel is visible
If Globals.ThisDocument.Application _
 .DisplayDocumentInformationPanel = True Then
 'Hide Document Information Panel
 Globals.ThisDocument.Application. _
 DisplayDocumentInformationPanel = False
Else
 'Show Document Information Panel
 Globals.ThisDocument.Application. _
 DisplayDocumentInformationPanel = True
End If

Word 應用程序對象的 DisplayDocumentInformationPanel 屬性可以獲取或設置一個布爾值,用來控 制文檔信息面板的顯示。

插入檢查表 Quick Part

基於元數據的內容可重用性是實現高效的任務自動化的關鍵要求之一。Word 2007 Quick Part 功能允 許用戶標識文檔的可重用內容部分、為這些內容部分分類以及將其作為 Quick Part 添加到默認的 Microsoft 構造塊模板或自定義 Quick Part 模板中。當該內容作為 Quick Part 被添加並復制到用戶計 算機的 AppData 文件夾後,用戶即可訪問任何 Word 2007 文檔的可重用內容。

要在自定義文檔信息面板中插入特定於所選類別的檢查表 Quick Part,可以通過調用以下方法從“插 入檢查表”功能區控件(圖 13)的單擊事件中檢索 ChCategory InfoPath 窗體 XML 字段:

Function GetChecklistCategoryInfoPathField() As String
Dim InfoPathXML As XmlDocument = New XmlDocument()
Dim ChecklistCategory As String
InfoPathXML.LoadXml(Globals.ThisDocument.CustomXMLParts.Item(4).XML)
ChecklistCategory = InfoPathXML.SelectSingleNode( _
"//*[local-name(.)='ChCategory']").InnerText
Return ChecklistCategory
End Function

作為自定義文檔信息面板附加的檢查表 InfoPath XML 是 CustomXMLParts 集合中的第四個文件,可以使用 CustomXMLParts 對象的 Item 屬性檢索該文件。將 InfoPath XML 加載 到新的 XmlDocument 對象中並查詢所選 ChCategory 節點的文檔。

圖 13 中顯示的方法可根據所選檢查表類別從檢查表 Quick Part 模板中篩選檢查表 Quick Part。然 後,所有剩余的檢查表 Quick Part 將被插入到文檔中,並且每個 Quick Part 都另起一頁。(有關識別 分類為 Quick Part 的檢查表並將其插入到自定義檢查表 Quick Part 模板中的詳細信息,請參閱 go.microsoft.com/fwlink/?LinkId=109830。)

Figure 13 插入檢查表 Quick Part 作為構造塊

Sub 

InsertChecklistQuickPartsAsBuildingBlock(ByVal _
  ChecklistCategory As String)
  'Declaration
  Dim oAttachedTemplate As Microsoft.Office.Interop.Word.Template
  Dim oBuildingBlock As Microsoft.Office.Interop.Word.BuildingBlock
  Dim selection As Microsoft.Office.Interop.Word.Selection
  Dim TotalQuickParts As Integer
  Dim iIndex As Integer
  'Define Attached Template - ChecklistsQuickPartsTemplate.dotm
  oAttachedTemplate = Globals.ThisDocument.AttachedTemplate
  'Get Total Number of quick parts available in the selected checklist
  ' category in the InfoPath form
  TotalQuickParts = oAttachedTemplate.BuildingBlockTypes _
    .Item(Word.WdBuildingBlockTypes.wdTypeQuickParts) _
    .Categories.Item("CL - " + ChecklistCategory) _
    .BuildingBlocks.Count
  selection = Globals.ThisDocument.Application.Selection
  'Insert all quick parts available in the defined category
  'Each quick part starts with a new page
  For iIndex = 1 To TotalQuickParts
    'Add Building Block Content Control
    selection.Range.ContentControls.Add(Word.WdContentControlType _
      .wdContentControlBuildingBlockGallery)
    'Define Quick Part as Building Block
    oBuildingBlock = oAttachedTemplate.BuildingBlockTypes _
      .Item(Word.WdBuildingBlockTypes.wdTypeQuickParts) _
      .Categories.Item("CL - " + ChecklistCategory) _
      .BuildingBlocks.Item(iIndex)
    'Insert Quick Part
    oBuildingBlock.Insert(selection.Range)
    selection.EndKey(Word.WdUnits.wdStory)
    selection.TypeParagraph()
    'No new page required if it is a last Quick Part
    If Not iIndex = TotalQuickParts Then
      selection.InsertBreak(Type:=Word.WdBreakType.wdPageBreak)
    End If
  Next
End Sub

當代碼檢索到與文檔相關聯的模板後(在本例中為 hecklistQuickPartsTemplate.dotm),它將通過 構造塊類型 (WdBuildingBlockTypes.wdTypeQuickParts) 和用戶選定的類別繼續篩選模板的 BuildingBlock 對象。最後,它將遍歷篩選後的 Quick Part 並將各個檢查表 Quick Part 作為內容控件 插入到文檔中。您會注意到 Selection 對象將用於在活動的 Word 2007 文檔中定義插入點。

接下來,代碼必須在插入下一個檢查表 Quick Part 之前,在文檔中插入一個分頁。Selection 對象 的 InsertBreak 方法可在 Word 文檔中插入頁面、欄或分節符。WdBreakType.wdPageBreak 枚舉指定分 隔符為分頁符。

綁定

因為 InfoPath 窗體字段和文檔屬性是作為自定義 XML 文件定義和存儲的,所以可以將文檔信息面板 中的可用信息綁定到文檔的內容控件中。以下代碼顯示了如何將內容控件綁定到在自定義文檔信息面板中 填充的 ProjectName InfoPath 窗體字段:

'Sample code to bind first content control to InfoPath
'Form Field ProjectName
Globals.ThisDocument.ContentControls(1).XMLMapping.SetMapping _
("//*[local-name(.)='ProjectName']", , _
Globals.ThisDocument.CustomXMLParts.Item(4))

XMLMapping 對象展示了 Word 2007 內 容控件與 XML 節點之間的映射——XMLMapping 對象的 SetMapping 方法將建立此映射。我已使用 XPath 表達式確定了自定義 XML 文件的節點 ProjectName。利用文檔對象的 CustomXMLParts 集合來檢索檢查 表 InfoPath 窗體 XML 文件。

以下代碼演示了如何將內容控件綁定到類別標准文檔屬性:

'Sample code to bind first content control to a standard document
'property - category
Globals.ThisDocument.ContentControls(2).XMLMapping.SetMapping _
("//*[local-name(.)='category']", , _
Globals.ThisDocument.CustomXMLParts.Item(1))

這段代碼與使用 InfoPath 窗體字段映射內容控件的代碼之間的唯一區別就在於 XPath 表達式的變化 和用於從 CustomXMLParts 集合中檢索文檔部件的索引的變化。

圖 14 顯示了如何將內容控件綁定到與 ProjectName 檢查表元數據相關的 InfoPath 窗體字段,然後 再綁定到 Category 文檔標准屬性。如您所見,映射的屬性值自動在內容控件中填充。

Figure 14 Content Control Bound to InfoPath Form Field

將文檔信息面板與文檔集成

可以將標准和擴展文檔屬性作為 Quick Part 集成到文檔中。如您所知,標准文檔屬性可以在文檔信 息面板的標准屬性視圖中管理,而擴展文檔屬性可通過文檔信息面板使用高級文檔屬性管理窗口訪問。

如圖 15 所示,導航到“Insert”(插入)選項卡,然後單擊 Quick Part 選項。“Document Property”(文檔屬性)選項使用戶能夠插入標准和擴展文檔屬性。在圖中,Author 標准文檔屬性作為 Quick Part 被添加到文檔中。插入的 Quick Part 與文檔屬性緊密集成在一起。在示例中,如果在文檔 信息面板或文檔 Quick Part 中更改了 Author 屬性值,則修改後的值會自動反映出來,而文檔屬性也會 隨之更改。

Figure 15 Author Standard Document Property Added as a Quick Part

版本問題

2007 Office 系統產品套件允許您在兼容模式下打開和保存文檔,以便使用早期 Office 版本 (Office 97-Office 2003) 的用戶能夠打開和處理文檔。顯然,我的解決方案無法支持早期 Office 產品 版本不支持的功能。讓我們來了解一下這個問題。

文檔信息面板顯示標准文檔屬性和自定義文檔屬性。只有當文檔是在兼容模式下存儲的,並且僅使用 2007 Office 系統應用程序處理過該文檔時,與標准和自定義文檔信息面板視圖相關的所有功能才能正常 工作。

但是,一旦使用早期 Office 版本打開並保存了文檔,自定義文檔信息面板及其相關功能將與文檔分 離。即使稍後再次使用 Office 2007 打開此文檔,用戶也無法使用相應的信息。

好消息是即使使用早期 Office 版本在兼容模式下打開並保存了 2007 Office 系統文檔,標准文檔屬 性仍會保留原樣。如果使用 Office 97-Office 2003 打開該文檔,用戶可通過文檔屬性管理對話框訪問 標准文檔屬性。如果用戶使用 2007 Office 系統打開文檔,則可通過文檔信息面板訪問標准文檔屬性。 在跨版本的情況下,對標准屬性所做的所有更改都會保留下來。

如果選中“Always show Document Information Panel on document open and initial save”(文 檔打開時和首次保存時,始終顯示文檔信息面板)選項以使文檔信息面板始終可見,這時如果在兼容模式 下保存了文檔,然後又使用早期 Office 版本打開並保存,該信息將不會再保留。在這種情況下,當文檔 在早期版本中被首次保存後,如果再次使用 Office 打開該文檔,文檔信息面板默認為不可見。

如果文檔屬性被綁定到文檔中的內容控件,則在兼容模式下保存 Word 2007 文檔時,所有內容控件都 將轉換為靜態文本,並且不會再映射到文檔屬性。

總結

有效使用標准和自定義文檔信息面板可以促進高效的元數據管理,並且可以與 Quick Part 和內容控 件相結合,構建有效的內容管理應用程序。使用這些技術的價值在於能夠標准化、結構化 Word、Excel 和 PowerPoint 2007 版本中的元數據。此功能越被廣泛采用,使用它來搜索內容和推動業務流程就會越 簡單。

如果您對文檔信息面板功能有任何疑問,歡迎您隨時發送電子郵件至 [email protected]。另外提醒您,本項目的所有代碼都位於《MSDN雜志》的網站上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved