天天看點

如何操作 Office Open XML 格式文檔(轉)

如何操作 Office Open XML 格式文檔(MSDN)

摘要: Office Open XML格式檔案代替了早期的二進制Office系統檔案。本文檔向您介紹了包含在一個格式化文檔中的元件以及展示這些檔案功能的一些場景 。

Frank Rice,微軟公司

适用于: Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007

下載下傳2007OfficeManipulatingOpenXMLFilesSample.exe.

本頁内容
概述
建立一個Office Open XML格式檔案
浏覽Office Open XML格式檔案
手動編輯由Office Open XML格式建立的文檔
通過程式設計來操作Office Open XML格式文檔
結論
額外資源

概述

在Microsoft Office的早期版本中,由Microsoft Office Excel, Microsoft Office PowerPoint和Microsoft Office Word建立的檔案以獨有的,單一檔案格式進行儲存,它們稱之為二進制檔案。Microsoft Office System 2007的釋出為Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007和Microsoft Office Word 2007引入了一個新的檔案格式:Office Open XML格式。

Office Open XML格式是基于XML和ZIP歸檔技術建立的。和早期Microsoft Office版本類似,2007的文檔儲存在一個單一的檔案或者容器中,是以管理這些文檔的過程仍然是簡單的。但是,與早期檔案不同的是Office Open XML格式的檔案能夠被打開顯示器中的元件,使得您能夠通路此檔案的結構。

在本文中,您可以手動的打開檔案并且浏覽組成此文檔那個的每一個部件來檢視Office Open XML格式檔案。另外您也可以對此文檔進行程式設計。在本文中适用到的檔案可以通過下載下傳獲得, 2007OfficeManipulatingOpenXMLFilesSample.exe.如果您不能夠下載下傳,您可以使用自己的程式檔案和圖像檔案進行替代。

傳回頁首

建立一個Office Open XML格式檔案

此部分中,您将檢測一個包含文本,圖像和屬性的示例Word 2007文檔的XML檔案格式。

在Word中建立一個Office Open XML 格式文檔

1. 啟動 Word 2007。
2.

在建立文檔中,粘貼以下文本:

Soaring with the American Bald Eagle

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla rutrum. Phasellus feugiat bibendum urna. Aliquam lacinia diam ac felis. In vulputate semper orci. Quisque blandit. Mauris et nibh. Aenean nulla. Mauris placerat tempor libero.

Pellentesque bibendum. In consequat, sem molestie iaculis venenatis, orci nunc imperdiet justo, id ultricies ligula elit sit amet ante. Sed quis sem. Ut accumsan nulla vel nisi. Ut nulla enim, ullamcorper vel, semper vitae, vulputate vel, mi. Duis id magna a magna commodo interdum.

3. 高亮顯示Soaring with the American Bald Eagle,然後在 開始标簽,在樣式組中,設定樣式為标題。
4. 下一步,在文檔中插入一張圖檔:
1. 将滑鼠指針放置在第一段落的末尾,并且點選回車插入新行。
2. 然後,點選插入标簽,點選圖檔,找到一個圖檔檔案 (例如包含在下載下傳中的Eagle1.gif檔案),然後點選插入。
5. 現在添加一個文檔屬性:
1. 點選Microsoft Office按鈕,指向準備,然後點選屬性 。
2. 在文檔屬性面闆中,添加作者名稱,标題,主題和備注,類似于以下:
表1.文檔屬性設定
屬性 描述
作者 Nancy Davolio
标題 Soaring with the American Bald Eagle
主題 Bald Eagles
備注 A study of the bald eagle
6. 下一步,在文檔中添加一些批注
1. 在審閱标簽下,點選建立批注。
2.

在批注框中,輸入This is my comment。此時您的文檔類似于圖1。

圖1. 示例Office Word 2007 文檔

7. 下一步,儲存文檔:
1. 點選Microsoft Office 按鈕,然後點選另存為。
2. 在另存為檔案類型清單中,選擇 Word Document (*.docx),然後在檔案名稱框中輸入SampleWordDocument.docx。
3. 點選儲存。
8. 關閉Word。

傳回頁首

浏覽Office Open XML格式檔案

在此部分中,您将浏覽您剛剛建立的示例文檔。

浏覽Office Open XML 格式文檔

1. 打開Windows資料總管。
2.

找到 SampleWordDocument.docx檔案,右鍵點選此檔案,然後選擇重命名。

重要:

使用下面的三個步驟來抽取Office Open XML格式檔案。根據您使用的作業系統不同(Windows XP或Windows Vista),第5步有所不同。

3. 在檔案名稱後面添加一個.zip擴充名,檔案名稱現在變為 SampleWordDocument.docx.zip。
4. 當彈出警告資訊時,點選确定。
5. 抽取容器檔案:
1. (如果您使用Windows XP:) 右鍵點選SampleWordDocument.docx.zip檔案,指向打開方式,然後點選Compressed (zipped) Folders。此時組成文檔的檔案夾和部件将會顯示在資料總管中。
2. (如 果您使用Windows Vista:) 右鍵點選SampleWordDocument.docx.zip 檔案,然後點選Extract All。 在Extract Compressed (Zipped) Folders 對話框中,接受預設位置或者選擇一個新的位置,然後點選Extract。此時組成文檔的檔案夾和部件将會顯示在資料總管中。
在下面的步驟中,您将檢測包含在文檔中的關鍵部件。
6. 檢測 [Content_Types].xml部件:
1. 使用Windows資料總管,找到名為[Content_Types].xml的檔案。
2. 右 鍵點選此檔案,指向打開方式,然後點選Internet Explorer。每一個Office Open XML格式文檔的根下都有一個 [Content_Types].xml 元件。 [Content_Types].xml元件的作用就是确定文檔中每個唯一類型元件。每個元件需要在這個元件中列出它自己的類型。元件需要有可以識别的類 型,以便應用程式知道當渲染此文檔時如何使用這個元件。類型也能夠使您了解到元件的作用以及如何使用。
3. 關閉檔案。
7.

檢測.rels 檔案夾:

關 聯代表着兩個元件之間的連接配接。關聯是存儲在_rels子檔案夾中的元件。任何元件都有相關聯的元件,包含在同結構的_rels檔案夾中,此檔案夾包含了一 個定義它們關系的.rels元件。子檔案夾建立在與元件相同的檔案夾下。一個關聯的名稱通過在原始元件的檔案名後加上.rels擴充名獲得 (用于文檔檔案的關聯元件是一個例外;它的名稱為“.rels”)。

1. 在Windows資料總管中,輕按兩下_rels 檔案夾,然後右鍵點選.rels 檔案。
2. 指向打開方式,點選選擇程式,點選Internet Explorer,然後點選确定。
3. 完成檢測後,關閉IE。
8.

檢測docProps 檔案夾:

2007版本中的文檔屬性在三個Microsoft Office System程式中是始終保持結構化的。分成三個邏輯XML元件,它們被存儲自docProps子檔案夾下。這使得使用者可以很容易的進行通路,因為他們它們在相同的位置并且不會和其它的文檔内容混淆。

在Windows資料總管中,輕按兩下docProps 檔案夾,右鍵點選core.xml 檔案,指向打開方式,然後點選Internet Explorer。

9.

檢測core.xml 元件:

打開 core.xml 元件,然後觀察顯示的您之前輸入的屬性。 core.xml元件持有使用者輸入的用來辨別文檔的屬性,例如标題,主題和作者。

10.

檢測custom.xml 元件:

從Windows資料總管中,在Internet Explorer中打開custom.xml。

custom.xml 元件包含了被使用者,開發人員或者通過自定義邏輯添加到文檔任何自定義文檔屬性。

11.

檢測app.xml 元件:

從Windows 資料總管中,在Internet Explorer中打開 app.xml。

app.xml 元件包括在應用程式級别指定到文檔的唯一屬性,例如文章的頁數,文本行的數量,應用程式的版本等等。

12.

檢測word檔案夾:

大部分的内容元件都駐留在word子檔案夾下面。另外,在裡面也有一個_rels關聯子檔案夾。

輕按兩下 _rels 檔案夾。

在_rels 子檔案夾中,用于連接配接所有文檔元件的關聯名稱為document.xml.rels。

13.

檢測document.xml.rels 元件:

在Internet Explorer中打開document.xml.rels 。

關聯使用IDs和Uniform Resource Identifiers (URIs)來定位元件。它允許在沒有任何寫死引用的前提下所有非關聯的元件是無效的。在後面的章節中将會詳細讨論。

在Word檔案夾下面,注意styles.xml 元件。

14.

檢測styles.xml元件:

在Internet Explorer中 styles.xml。

這個包含了一些可用的重音和底紋,您可以在文檔中使用它們。

15. 必須的和可選的元件
16. 在Office Open XML格式檔案中這些元件的使用使得文檔能夠以高度子產品化的方式存儲。一些元件對文檔來說是必須有效的,例如document.xml元件和fontTable.xml元件。
17. 檢測document.xml 元件:
1. 在Internet Eexplorer中打開document.xml 。 document.xml 元件包含了文檔主體的文本。
2. 檢視完此檔案後,關閉Internet Explorer。
18. 檢測fontTable.xml 元件:
1.

在Internet Explorer中打開fontTable.xml元件。

fontTable.xml元件包含了文檔的字型設定。

2.

檢視完此檔案後,關閉Internet Explorer。

如果元件描述的功能在文檔中使用不到的話,這些元件就不是必需的。示例中包括了備注,頁眉元件和頁腳元件,這些元件對Word文檔來說是可選的。這就使得使用者能夠輕松的通過文檔結構進行操縱,而不需要研究沒有使用的内容。

XML 設計用于結構化的内容,并不會本地支援二進制的内容,例如圖像或者OLE對象。二進制資料能夠被編碼到字元并且以XML形式進行存儲,但是它需要一個編碼 和解碼的過程,這就使得對于應用程式或者開發人員來說效率低下。在2007釋出之後,此時就不在需要編碼二進制對象因為他們能夠作為二進制元件以他們自身 的格式進行存儲。是以在Office文檔中通路二進制對象變得非常容易。媒體檔案存儲在media檔案夾中。

19.

檢測word"media和word"embeddings檔案夾:

在Windows資料總管中,輕按兩下media子檔案夾。

注意.gif媒體檔案表示您之前插入的圖像。

備注:

您 可能注意到圖像的檔案名稱已經從Eagle1.gif更改為image1.gif了。更改的目的是為了解決隐私考慮,因為一個惡意使用者可以從文檔中的元件 名稱中獲得關于此元件的一些内容,例如一個圖像檔案。例如,一個作者可能通過加密文檔中的文本部件來保護文檔内容。但是,如果兩個圖像 old_widget.gif and new_reenforced_widget.gif 被插入。即使文本被保護起來了,惡意使用者也能夠知道widget已經被更新了。使用像image1和image2這樣的通用圖像檔案可以在Office Open XML格式檔案中添加額外的保護。

20. 關閉SampleWordDocument.docx.zip ,不儲存。

傳回頁首

手動編輯由Office Open XML格式建立的文檔

Office Open XML格式擁有很多的優勢。其中一個優勢就是具有可以在沒有Office程式的情況下使用由Office 2007系統建立的文檔的能力。這就使得您能夠建立基于伺服器的解決方案,用于在可伸縮的環境下集合,通路和編輯文檔。

在下面的步驟中,您将手動的編輯一個Word 2007文檔。請注意這些場景隻是這個新的檔案格式的一個很小的示例。在大部分的場景中,使用者不會以這種方式手動編輯文檔。但是對于開發人員,在不需要編 寫代碼的情況下浏覽由Office 2007建立的文檔将帶來很大的好處,尤其是當設計解決方案或者編寫程式模型的時候。如您之前看到的,在通路此文檔的容器檔案後,您能夠輕松的浏覽獨立的 元件。這也就意味這您能夠編輯,替換甚至添加元件。通常情況下,您可以修改文檔的備注,更新文檔屬性。

利用XML修改Office Open XML格式文檔

1.

在Word 2007中,打開SampleWordDocument.docx 文檔。

備注:

在打開檔案之前,請先删除檔案的.zip擴充名

2. 點選Microsoft Office按鈕,指向準備,然後點選屬性。注意作者,标題,主題和備注框體,然後關閉文檔。
3. 打開Windows資料總管,浏覽到SampleWordDocument.docx 文檔。
4.

使用 steps described for your operating system抽取文檔檔案。

Word 2007文檔中的備注存儲在名稱為comments.xml的元件中。這種文檔主體的分離使您能夠輕松的定位和修改元件。

5. 将comments.xml 元件從壓縮文檔中拖拽到Windows桌面。
6. 右鍵點選comments.xml 元件,指向打開方式,然後選擇文本編輯器或者XML編輯器打開,例如記事本。
7. 定位到下面的文本:
<w:t>A study of the bald eagle</w:t>
      
8. 替換或者編輯<w:t>元素的文本,例如,将其更改為:
<w:t>A detailed study of the bald eagle</w:t>
      
9. 儲存并且關閉檔案。
10. 從Windows桌面中,将comments.xml 元件拖拽到壓縮檔案的word 檔案夾中。
11.

當彈出确認檔案替換警告消息時,點選确定。

下一步,您可以更改文檔屬性,然後确認更改的結果。文檔屬性存儲在壓縮檔案根目錄下面的子檔案夾中,使得他們能夠輕松的通路和編輯。

12. 輕按兩下docProps 檔案夾。
13. 将core.xml 元件從壓縮文檔中拖拽到Windows桌面。
14. 在文本編輯器中打開core.xml。
15. 定位到下列文本:
<dc:creator>Nancy Davolio</dc:creator>
      
16. 替換或者編輯<dc:Creator> 元素的文本。例如,使用您自己的名字替換裡面的文本。
17. 儲存并且關閉檔案,然後将其拖拽回docProps 檔案夾。
18. 當彈出确認檔案替換警告消息時,點選确定。
19. 通過點選回退箭頭或者工具欄中的up圖示導航到文檔容器直到您定位到.zip檔案。
20. 從檔案名稱中移出.zip 擴充名,然後在Word 2007中打開檔案。
21.

點選 Microsoft Office 按鈕,指向準備,然後點選屬性。

注意備注文本已經更改了。同時作者屬性也已經更改。

在以前的步驟中,您通過在文檔中編輯XML元件的方式修改了文檔。利用新的檔案格式,您也可以替換整個文檔元件來更改内容,格式或者屬性。這就使得您使用存在的文檔元件來更新單個的文檔或者更新整個文檔庫。

使用存在的元件來修改文檔的一個例子就是更改文檔使用的樣式。如果您需要管理多個文檔的樣式,但是希望保留一個實體的版本,這種方式将很有用。更改文檔使用的所有類型就是替換styles.xml元件。

此場景使您能夠為所有的文檔編譯樣式元件集合,然後建立一個應用程式,使得使用者能夠自動的選擇不同的樣式。在背景,您的應用程式能夠用一個預制的元件代替另外一個。在下面的步驟中,您将手動的執行此操作。

通過替換已存在元件的方式修改一個Office Open XML格式文檔

1. 複制一份SampleWordDocument.docx 文檔,然後将其命名為 AnotherSampleWordDocument.docx。
2. 在Word 2007中打開 AnotherSampleWordDocument.docx。
3.

在開始頁面,點選更改樣式,指向樣式集,然後點選獨特。此文檔看上去類似于圖2。

圖2. 在獨特樣式中的文檔

4. 儲存并且關閉文檔。
5. 使用 steps described for your operating system.來提取出AnotherSampleWordDocument.docx文檔檔案。
6. 輕按兩下word 檔案夾,然後将styles.xml 元件拖拽到Windows桌面。此元件将被用于更新您建立的第一個文檔。
7. 點選工具欄中的回退箭頭或者Up圖示導航到文檔容器,直到定位到.zip檔案。
8. 現在,在Word 2007中打開SampleWordDocument.docx 文檔,注意文檔主體的樣式。
9. 關閉文檔。
10. 使用 steps described for your operating system提取SampleWordDocument.docx 文檔檔案。
11. 輕按兩下打開word 檔案夾,然後将styles.xml 從Windows桌面拖拽到word 檔案夾,替換原來的檔案。
12. 當彈出确認檔案複制警告消息時,點選确定。
13. 通過點選工具欄中的回退箭頭或者Up圖示導航到SampleWordDocument.docx 檔案的文檔容器,直到定位到.zip檔案。
14.

從檔案名中移出.zip 擴充名,然後在Word 2007中打開檔案。

注意文檔樣式已經更改為在AnotherSampleWordDocument.docx中看到的那樣。

請首先将AnotherSampleWordDocument.docx.zip檔案名的.zip擴充名移出。

此樣式場景的另外一個樣子就是使用頁眉頁腳文檔元件從一個Word 2007文檔中快速的複制相同的設定到一個或者多個Word 2007文檔中。頁眉頁腳元件能夠被手動的更改,您将在後面的内容中了解到。當然,這個過程也能夠使用代碼進行自動化。這對于那些希望使用标準文檔頁眉和 頁腳,并且不需要在每個基本文檔中付出管理任務的組織來說非常有用。另外,如果您的頁眉頁腳格式更改後,替換頁眉頁腳是非常容易的。

在下面的步驟中,您将添加一個簡單的頁眉到SampleWordDocument.docx中。然後使用來自AnotherSampleWordDocument.docx文檔的不同的頁眉來更新它。

更新Office Open XML 格式文檔的頁眉

1. 在Word 2007中打開 SampleWordDocument.docx。
2.

在插入标簽中,點選頁眉按鈕的下拉鍵頭,然後選擇字母表型頁眉。頁眉将被添加到文檔的标題中。此文檔看上去類似于圖3。

圖 3. 使用字母表型頁眉的示例文檔

3. 儲存并且關閉檔案。
4. 在Word 2007中打開AnotherSampleWordDocument.docx。
5.

在插入标簽中,點選頁眉按鈕的下拉鍵頭,選擇年刊型頁眉。頁眉将被添加到文檔的标題中,并且帶有年份。此文檔那個看上去類似于圖4。

圖 4. 帶有年刊型頁眉的示例文檔

6. 儲存并且關閉檔案。
7. 使用steps described for your operating system.為AnotherSampleWordDocument.docx提取文檔檔案。
8. 輕按兩下word 檔案夾,然後将header1.xml 檔案拖拽到Windows桌面。
9. 通過點選工具欄中的回退箭頭或者Up圖示導航到文檔容器,直到定位到.zip檔案。
10. 從AnotherSampleWordDocument.docx.zip 檔案名中移出.zip檔案擴充名。
11. 使用 steps described for your operating system為SampleWordDocument.docx提取文檔檔案。
12. 輕按兩下word 檔案夾打開它,将header1.xml 檔案從Windows桌面拖拽到word 檔案夾。
13. 當彈出确認檔案替換警告消息時,點選确定。
14. 通過點選工具欄中的回退箭頭或者Up圖示導航到文檔容器,直到定位到.zip檔案
15.

Remove the .zip extension from the從 SampleWordDocument.docx.zip 檔案名中移出.zip擴充名,然後在Word 2007中打開這個檔案。

注意新的頁眉。

文檔中也能夠包含二進制元件-例如圖像檔案或者Microsoft VBA項目,您可以将其作為XML元件那樣輕松的通路。更換二進制元件會帶來一些有趣的事情。例如您可以更換二進制元件來替換整個的OLE對象,如 Microsoft Office Visio圖像。手動的操作沒有價值,您需要考慮一個使得圖像能夠自動從伺服器更新的場景。編寫一個工具來完成這樣的操作相對來說是簡單的人物。在下面的 步驟中,您将使用一個圖像來交換AnotherSampleWordDocument.docx 文檔中的圖像二進制檔案。

在Office Open XML格式文檔中交換二進制元件

1. 使用 steps described for your operating system.為SampleWordDocument.docx提取文檔檔案。
2. 輕按兩下Word檔案夾,然後輕按兩下media檔案夾來定位到Eagle1.gif圖像。
3. 右鍵點選Eagle1.gif 然後點選預覽。這是出現在文檔中的圖像。
4. 在下載下傳檔案中定位到Eagle2.gif 圖像,然後将其複制到Windows桌面。(或者您可以替換您自己的圖像檔案)
5. 在Windows桌面上,右鍵點選Eagle2.gif 圖像,然後點選預覽。這是您将使用替換目前圖像的圖像檔案。
6. 關閉預覽視窗,右鍵點選Eagle2.gif,然後點選重命名,将其名稱更改為Eagle1.gif。
7. 将重新命名過的Eagle1.gif從Windwos桌面上拖拽到media檔案夾中。
8. 當彈出确認檔案替換警告消息時,點選确定。
9. 通過點選工具欄中的回退箭頭或者Up按鈕導航到文檔容器,直到定位到.zip檔案。
10. 将名稱中的.zip擴充名移出掉,然後在Word 2007中打開檔案。注意圖像已經被更新了。

一些元件在Microsoft Office系統文檔中是必須的,例如Word 2007中document.xml元件。但是,一些元件是可選的,隻在需要某些功能的時候存在。這就意味着如果您不需要某些功能,您可以移出這些元件和 相關的關系。包含項目代碼的2007 Office文檔被稱為“macro-enabled”文檔(用于Word 2007的.docm 擴充名,用于Excel 2007的.xlsm擴充名和用于PowerPoint 2007的.pptm擴充名)。不像"macro-free"文檔,macro-enabled 文檔在元件中存儲代碼。元件的類型依賴于文檔中代碼的類型。例如,包含VBA代碼的macro-enabled文檔在vbaProject.bin 二進制元件中存儲它的資料。

其他的項目類型包含使用Excel 4.0-style macro(XLM macros)的Excel 2007工作簿中或含有指令按鈕的PowerPoint 2007幻燈。這些特性位于他們獨立的元件中,以便他們能夠被輕松的确認和移出。

在下面的步驟中,您将建立一個簡單的macro-enabled 文檔并且展示它的功能。然後,您将從文檔中删除vbaProject.bin元件及其關系并且檢視其效果。注意您也可以通過點選檔案菜單中的另存為,或者 通過儲存檔案為macro-free檔案(.docx, .pptx, or .xlsx)來移出macro-enabled檔案中的項目元件。但是,這需要您在2007 Office系統程式中打開此文檔。使用下面過程中的步驟可以使您在不使用Office程式的前提下移出項目。

從Office Open XML格式文檔中移出VBA項目

1. 使用Word 2007打開SampleWordDocument.docx。
2.

在開發工具标簽中的代碼組中,點選Visual Basic 來打開Visual Basic 編輯器。您也可以按ALT+F11來打開Visual Basic 編輯器。

備注:

如果您無法找到開發工具标簽,您需要添加它。點選Microsoft Office 按鈕,然後點選Word選項,然後在常用标簽中,選擇“在功能區顯示開發工具頁籤”。

3. 在Visual Basic 編輯器代碼視窗中,輸入或者粘貼以下語句:
Sub SampleCode()

        Msgbox("Hello World")

        End Sub
      

備注:

如果您無法看到代碼視窗,通過點選視圖菜單,然後選擇代碼視窗。

4. 在運作菜單中,點選運作子過程/使用者窗體來運作代碼。您也可以點選F5。
5. 點選确定關閉消息視窗,然後關閉Visual Basic 編輯器。下一步,作為macro-enabled文檔儲存。
6. 點選Microsoft Office 按鈕,指向另存為,然後點選Word 文檔。
7. 在儲存類型下拉清單中,選擇Word Macro-Enabled Document (.docm),然後點選儲存,關閉文檔。
8. 使用steps described for your operating system.為SampleWordDocument.docm提取文檔檔案。
9. 輕按兩下word 檔案夾,然後輕按兩下_rels檔案夾。
10.

鍵點選document.xml.rels,點選打開方式,然後選擇一個文本編輯器,例如Notepad。

備注:

這個檔案可能是隻讀的。如果是隻讀的話,關閉檔案,右鍵點選檔案名稱,點選屬性。然後清除隻讀屬性複選框。然後重新打開檔案。

11. 定位并且删除掉以下XML标記:
<Relationship Id="rId1" Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" Target="vbaProject.bin"/>
      
12. 儲存并關閉檔案。
13. 右鍵點選document.xml.rels 然後選擇複制。
14. 回到SampleWordDocument.docm.zip 檔案,然後打開它。
15. 輕按兩下word 檔案夾。
16. 右鍵點選vbaProject.bin 項目,然後點選删除。當提示消息時,點選确定來删除。
17. 輕按兩下_rels 檔案夾。
18. 右鍵點選,然後選擇粘貼。
19. 當提示确認檔案替換消息時(在Windows Vista中為複制和替換警告消息),點選确定。
20. 通過點選工具欄中的回退箭頭或者Up按鈕導航到文檔容器中,直到定位到.zip檔案。
21. 右鍵點選SampleWordDocument.docm 檔案夾,然後點選删除來删除它。當提示時,點選确定。
22. 從 SampleWordDocument.docm.zip 檔案名中移出.zip擴充名。當提示時,在重命名警告框中點選确定,然後重新使用Word 2007打開此檔案。
23.

按ALT+F11 檢視VBA 項目。注意子程式已經丢失。

備注:

您可以将檔案擴充名從.docm更改成.docx來獲得相似的結果。帶有macro-free 擴充名的檔案從來不會執行代碼。

傳回頁首

通過程式設計來操作Office Open XML格式文檔

Office Open XML格式的一個重要意義在于它對于自定義解決方案的無限潛能。您可以使用任何平台的能夠處理XML或者ZIP檔案的工具來通路并且修改文檔内容。例如, 您可以在Microsoft Visual Studio中利用托管代碼編寫一個伺服器端的應用程式來省城2007 Office系統文檔。您可以使用Microsoft .NET Framework的強大XML類庫來編輯Office Open XML格式檔案中包含的任何XML文檔元件。

操作文檔元件及其關系的一個強大方式就是使用System.IO.Packaging名稱空間,它包含在Microsoft Windows Software Development Kit中。System.IO.Packaging名稱空間将在後面的内容中詳細讨論。

備注:

您可以從微軟的下載下傳中心中下載下傳Microsoft Pre-Release Software WinFX Runtime Components—Beta2。

在下面的步驟中,您将開發一個控制台應用程式在不使用Word 2007的前提下更改格式樣式。這個項目通過利用從一個Word 2007文檔中提取出來的樣式元件來替換此文檔中的樣式元件來完成。結果就是目标文檔采用了與提取樣式那個文檔相同的樣式。

備注:

在此有很多這樣的代碼示例,您可以通過下載下傳獲得。在下載下傳了這些預制的代碼示例後,您将能夠在Microsoft Visual Studio 2005(在工具菜單中)中使用這些Code Snippet Manager 特性來将它們插入到你的項目中。您可以下載下傳2007 Office System Sample: Open XML File Format Code Snippets for Visual Studio 2005.

執行下面的步驟來更改一個文檔的格式。

在一個Office Open XML格式文檔中更改樣式

1. 首先,建立一個檔案夾和子檔案夾來宿主您将更新的文檔和styles.xml 元件。在這個練習中,命名檔案夾為WordOpenXMLFormatSample。在檔案夾中,添加一個名稱為NewStylePart的子檔案夾。
2. 複制SampleWordDocument.docx 到WordOpenXMLFormatSample 檔案夾中。
3. 導航到AnotherSampleWordDocument.docx 檔案,在檔案名後添加.zip檔案擴充名,然後打開檔案。
4. 在word檔案夾中導航到styles.xml 元件,右鍵點選它,然後點選複制。
5. 導 航到 WordOpenXMLFormatSample 檔案夾,然後導航到NewStylePart 子檔案夾。右鍵點選NewStylePart 子檔案夾,然後點選粘貼。檔案夾現在包含了預設樣式元件的Word 2007文檔,子檔案夾中包含了來自帶有名稱為“Fancy”樣式的文檔中的styles.xml元件。
6. 啟動Visual Studio 2005.
7. 在檔案菜單中,點選建立項目。
8. 在建立項目對話框中,從左邊的項目類型樹視圖中,點選其它語言,選擇Visual C#,然後從模闆清單視圖中選擇控制台應用程式。
9.

在名稱對話框中,将項目命名為StyleSwapper,然後點選确定。Visual Studio在項目中建立了所有的檔案,并且将他們存儲在項目下面的目錄中,例如drive"Visual Studio projects"StyleSwapper。

為了看到确切地項目儲存的位置,或者更改位置,執行下面操作:

1. 在工具菜單中,點選選項。
2. 在選項對話框中,點選項目和解決方案樹型視圖,然後點選正常标簽。 在此,您可以指定項目和模闆存儲的位置,或者設定其它選項。
3.

注意項目的位置,然後點選确定關閉視窗。

當您建立新的項目後,Visual Studio自動的建立新的程式,并帶有三個容器:屬性,引用和Program.cs。您可以在解決方案資料總管中檢視這三個容器。Visual Studio同時也建立了用于添加大部分代碼的空類。

備注:

Microsoft .NET Framework 3.0 (WinFX)包含了System.IO.Packaging 名稱空間。利用System.IO.Packaging 名稱空間,您能夠添加文檔元件,擷取和更新内容,或者建立新的關系,使您能夠建構新文檔或者修改現有的文檔名稱空間中一些重要的成員包含Package 對象,PackagePart 對象,和PackageRelationship 對象。關于System.IO.Packaging 名稱空間的更多資訊,請見System.IO.Packaging Namespace。

下一步,您将從您的項目中添加一個引用到.NET Framework 3.0:

10. 點選項目菜單,點選添加引用。
11. 在浏覽标簽中,在查找框中,搜尋到WindowsBase.dll。根據此文檔釋出的時間,檔案的位置位于drive"Program Files"Reference Assemblies"Microsoft"WinFx"v3.0.
12. 選擇WindowsBase.dll 檔案,然後點選确定。通過點選解決方案資料總管中的引用來驗證引用已經被建立。
13. 在解決方案資料總管中,右鍵點選Program.cs,然後選擇檢視代碼。
14. 在代碼視窗的名稱空間上面輸入下面代碼:
using System.IO; 

        using System.IO.Packaging;
      
要使用2007 Office系統文檔的内容,您需要打開它。System.IO.Packaging有一個稱為Package的頂級成員,它相當于文檔。在您代開 Package項目後,您将檢查它的結構,操作它的元件。Packages能夠作為隻讀,隻寫或者讀/寫形式打開。
15. 在Class Program 語句的括号({)後面添加以下代碼。以下行中設定了包含您Word文檔和style.xml位置的變量。這些語句假設WordOpenXMLFormatSample 檔案夾在C槽中建立。
private static String stylePath = @"C:"WordOpenXMLFormatSample"NewStylePart"styles.xml";

        private static String packagePath = @"C:"WordOpenXMLFormatSample"SampleWordDocument.docx.zip";
      

備注:

以@符号開始的字元串被稱為逐字字元串字面變量(verbatim string literals)。這就告訴程式使用擷取檔案時出現的那些确定的字元串。

16. 當運作項目時,Main 過程将自動的執行。在Main的開闊号({ )和閉括号(})之間,輸入以下行:
SwapStylePart(packagePath, stylePath);
      
此行調用了SwapStylePart 過程,您将在下面添加。它将路徑傳輸到了Word 2007文檔和styles.xml 元件中。
17. 在Main後的閉括号(})之後添加下面的代碼:
static void SwapStylePart(String packagePath, String stylePath)

        { }
      
下面步驟中,您将添加代碼到SwapStylePart 程式中,此程式用于打開作為Package對象并且擁有讀/寫通路權限出現的文檔。注意using 語句的使用。它的目的是自動的處理Package 對象并且在語句完成之後清空使用的記憶體。
18. 将下列代碼輸入到SwapStylePart 程式中:
using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.ReadWrite))

        { }
      
為了能夠使用2007 Office系統文檔的任何元件,您首先需要定位它。您可以使用URL來引用一個特定的文檔元件,URL是對每個元件唯一的路徑。
19. 在using 語句的括号之間輸入下面的語句:
// Set the URI for the styles document part (/word/styles.xml). 

        Uri uriPartTarget = new Uri("/word/styles.xml", UriKind.Relative);
      
在編寫此文章的那個時刻,System.IO.Packaging名稱空間還不允許您複制或者替換一個已 經存在的元件。為了交換元件,您必須首先删除已經存在的元件,然後使用相同的URL建立一個新的元件。注意删除元件不會影響任何元件的關系。任何關系都完 好無損并且仍然應用到一個新的元件。
20. 在您上個步驟中添加的行後面輸入以下代碼:
// Delete the existing document part (/word/styles.xml).

        package.DeletePart(uriPartTarget);
      
在package中添加一個新的文檔元件需要使用一個URL。在這種情況下,您僅僅需要重新使用相同的 URL來重新建立樣式文檔元件。當建立一個package時需要一個額外的參數:元件的内容類型。目前在文檔中使用的内容類型可以在位于文檔容器中的 [Content_Types].xml元件中發現。
21. 在您上個步驟中添加的行後面輸入以下代碼:
// Recreate a new document part for styles(/word/styles.xml). PackagePart

        packagePartReplacement = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");
      

利用新建立的樣式元件,最後一步就是從原始的styles.xml元件中的XML複制到新建立的元件中。 System.IO.Packaging名稱空間不會在一個XML文檔中本地的處理XML,是以在.NET Framework中複制内容的方式就是通過使用Streams。

在下面的步驟中,您将添加代碼,這些代碼以流的形式打開外部樣式元件,并且将其寫入到新的樣式文檔元件中。為了複制流,您将調用CopyStream程式,并且在源和目的流中傳輸。

22. 在您上個步驟中添加的行後面輸入以下代碼:
using (FileStream fileStream = new FileStream(stylePath, FileMode.Open, FileAccess.Read))

        {// Load the new styles.xml

        using a stream.CopyStream(fileStream,packagePartReplacement.GetStream());

        }      
23. 下一步,在SwapStylePart程式的閉括号後添加CopyStream程式:
private static void CopyStream(Stream source, Stream target)

        {

        const int bufSize = 0x1000;

        const int bufSize = 1024;

        byte[] buf = new byte[bufSize];

        int bytesRead = 0;

        while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)

        {

        target.Write(buf, 0, (int)bytesRead);

        }

        source.Close();

        target.Close();

        }      
這 個過程設定了記憶體中緩沖區的大小,來自于原始styles.xml元件的資料流存儲在緩沖區中。當有讀取位元組操作時,這些位元組會被寫入到新的 styles.xml元件中。To see the application in action, you need to build the project: 要檢視程式的效果,您需要生成項目:
24.

在生成菜單中,點選生成StyleSwapper。

備注:

如果在生成的時候發生錯誤,您将看到一個對話框問您是否希望運作上次的生成。點選否,您将看到錯誤清單中的錯誤描述。如果您沒有看到錯誤清單,在視圖菜單中,點選錯誤清單。

25. 假設沒有錯誤發生, 您現在運作代碼。但是首先,您可能想要檢視目前的文檔:
26. 在Word 2007中打開 SampleWordDocument.docx.
27. 關閉Word 2007然後在 SampleWordDocument.docx 檔案名後添加.zip 擴充名。
28. 按F5. 您将看到Windows控制台出現,很快您就會看到它消失了。因為這是一個控制台應用程式,它沒有使用者界面,隻是很簡單的出現。
29. 從檔案名中移出.zip 擴充名,然後在Word 2007中重新打開它。注意文檔的樣式已經更改為"獨特"樣式。

下面一個練習闡述在沒有Word 2007情況下您如何使用自定義的應用程式來在Office Open XML格式檔案中執行批量操作。在這個練習中,您将建立一個托管程式,這個程式搜尋滿足特定标準的檔案夾和子檔案夾,進而找到正确的檔案。應用程式為了術 語和包含資料檔案的出現來檢測文檔元件。您可以想象使用這個程式來确定包含特定客戶名稱的文檔,或者是包含特定産品名稱的文檔。您也可以在應用程式中添加 額外的邏輯,使用其他的術語來替換現有的,本質上就是在不使用應用程式的地情況下複制Word 2007中的查找-替換特性。

根據關鍵字搜尋一組Office Open XML格式檔案

1. 啟動Visual Studio 2005.
2. 在檔案菜單中,點選建立項目。
3. 在建立項目對話框中,從左邊的項目類型樹型視圖中,選擇Visual C#.然後選擇Windows 應用程式,更改項目的名稱為KeywordSearch,然後點選确定。Visual Studio 建立了項目中所有的檔案。
4. 在解決方案資料總管中,右鍵點選Form1.cs,然後點選檢視設計器。
5.

在 Form1.cs [Design] 标簽中, 将下面的控件添加到窗體中,然後設定它們的屬性,以至于窗體類似于圖5。

圖5. KeywordSearch 窗體

表2. 用于Office Open XML 格式文檔關鍵字搜尋窗體的控件清單

類型 屬性
Label Text: Search Directory
TextBox Name: txtPath
Text: C:"WordDocuments 注意這是搜尋開始的預設目錄。
Label Text: Search Pattern
ComboBox Name: cboMask
Items (Collection): *.docx *.docm
Text: *.docx
CheckBox Name: ckbSubfolders
Text: Include Subfolders
Label Text: Search Term
TextBox Name: txtTerm
Button Name: btnSearch
Text: Search
Button Name: btnClose
Text: Close
Label Text: Results
ListBox Name: lbxResults
6. 在解決方案資料總管中,右鍵點選Form1.cs,然後點選檢視代碼。
7. 在代碼視窗中,在已存在的using 語句後面添加下面的語句:
using System.Xml; using System.IO; using System.IO.Packaging;
      
要使用System.IO.Packaging 名稱空間,您需要添加一個到WindowsBase.dll庫的引用,它位于.NET Framework 3.0 SDK (WinFX)中:
8. 在項目菜單中,點選添加引用。
9. 在浏覽标簽中的查找框中,搜尋WindowsBase.dll 檔案名。根據此文章釋出的時間,檔案位于drive"Program Files"Reference Assemblies"Microsoft"WinFx"v3.0目錄中。
10. 點選确定。
11. 在 public partial class Form1 : Form的開括({)号後面,添加下面的類變量:
FileInfo[] tempfiles; List<FileInfo> files = new List<FileInfo>();
      
下一步,添加代碼到搜尋按鈕中:
12. 在Form1.cs [Design] 标簽中,輕按兩下搜尋按鈕添加Click事件。
13. 在 btnSearch_Click 過程的兩個括号之間,添加下面的代碼:
Boolean match = false; // Ensure that the user added a search term.

        if (txtTerm.Text == "")

        {

        MessageBox.Show("Don\'t forget the search term.");

        }

        List<FileInfo> returnedFiles; // Get the starting directory. 

        DirectoryInfo dir = new DirectoryInfo(txtPath.Text); // Get the list of files.

        returnedFiles = GetDirFiles(dir); // Loop through the file list.

        foreach(FileInfo file in returnedFiles)

        {

        match = GetDocPart(file);

        }

        if(!match)

        { // No matching files were found.

        lbxResults.Items.Add("No matches.");

        }      
在 這個代碼中,聲明了Boolean 變量用于顯示是否搜尋發現了任何比對的内容。下一步,如果文本框是空的,代碼将提示使用者輸入搜尋的關鍵字。在窗體中的其它文本框都有預設值。下一步,定義 一個List 類來包含從搜尋中傳回的檔案。List 類提供了一個數組,在此數組中可以動态的提升大小。變量 dirs 指向了搜尋開始的目錄。然後指向GetDirsFiles 過程的調用将在目錄中傳回檔案清單。接下來代碼将循環查詢傳回的檔案集,調用GetDocPart 過程來為搜尋關鍵字檢測每一個檔案。如果沒有比對的選項,一個消息将被添加到清單框中。
14. 添加 GetDirFiles 程式:
public List<FileInfo> GetDirFiles(DirectoryInfo dir)

        { // Get all files for the current directory.

        Object selectedItem = cboMask.SelectedItem;

        tempfiles = dir.GetFiles(selectedItem.ToString());// Add these files to the returned file list.

        foreach (FileInfo file1 in tempfiles)

        {

        files.Add(file1);

        }// Search subfolders if requested.

        if (ckbSubfolders.Checked)

        {// Get subfolders for the current directory.

        DirectoryInfo[] dirs = dir.GetDirectories("*.*");

        foreach (DirectoryInfo directory in dirs)

        {

        GetDirFiles(directory);

        }

        }

        return files;

        }      
這 個程式設定selectedItem 變量等于顯示在combo框中的搜尋樣式。下一步,在目前的目錄中調用 GetFiles 方法來傳回所有符合搜尋樣式的檔案。傳回的檔案被添加到檔案清單中。如果一個使用者選擇了Include Subfolders 複選框,每個目前目錄的子目錄通過遞歸行式調用GetDirFiles 程式(帶有每個子檔案夾名稱的)而被搜尋到。最後檔案清單就被傳回到調用(btnSearch_Click) 程式中。
15. 在 GetDirFiles 程式後面添加下面的代碼:
private Boolean GetDocPart(FileInfo file)

        { // Retrieve the start part for the input file.

        Boolean fileFound = false;

        const String documentRelationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";

        const String dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";// Open the package with read access.

        using (Package myPackage = Package.Open(file.DirectoryName + """" + file.Name, FileMode.Open, FileAccess.Read))

        { // Get the main document part (document.xml).

        foreach (PackageRelationship relationship in myPackage.GetRelationshipsByType(documentRelationshipType))

        { // There should be only one document part in the package.

        Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);

        PackagePart documentPart = myPackage.GetPart(documentUri);

        NameTable nt = new NameTable();

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);

        nsmgr.AddNamespace("w", dcPropertiesSchema);

        XmlDocument doc = new XmlDocument(nt);

        doc.Load(documentPart.GetStream());

        if (doc.OuterXml.IndexOf(txtTerm.Text) >= 1)

        {

        lbxResults.Items.Add(file.DirectoryName + """" + file.Name);

        fileFound = true;

        }// There is only one document part, so exit the loop. break;

        }

        }

        if (lbxResults.Items.Count >0)

        {

        return true;

        }

        else

        {

        return false;

        }

        }      

此 程式初始時分别設定變量值為文檔關系類型中的名稱空間和文檔屬性的架構。接着文檔作為Package 對象被打開。在System.IO.Packaging 名稱空間中,您可以通過元件之間的關系(定義在關系元件中),通過包含元件結構路徑的URL來通路package中各種各樣的元件。 用于圖像元件的一個URL示例就是 "word"media"picture.jpg. 如果您知道到2007 Office系統文檔中特定文檔元件的URL,您可以直接的通路,編輯或者删除元件。在GetDocPart 程式中,通過調用Package 對象中的GetPart 方法,然後傳輸到元件URL中進而傳回document.xml 元件。

下一步, XmlDocument 對象指向了一個XML檔案,此檔案包含一個或多個到不同名稱空間的引用。和所有的XML檔案一樣,XML解析器通過帶有名稱空間字首的名字來通路文檔中大量的元素和屬性。

備注:

沒有限定符的元素名稱被認為是一個預設名稱空間的元件。

這 些名稱空間的限定符在運作時必須被解析到它們名稱空間的引用。為了使此任務輕松并且一緻,.NET Framework 包含了提供大量名稱空間管理工具的XmlNamespaceManager。其中一個就是NameTable 類。NameTable 類在内部存儲了屬性和元素名稱。當一個元素或者屬性名稱在一個XML文檔中出現多次時,它隻在NameTable 中存儲一次。當一個名稱空間限定符發生沖突時,它能夠使用NameTable 中的字元串進行解析。

在下一個 語句中,建立了一個XmlDocument 對象,并且利用文檔元件中的内容進行填充。下一步,為了搜尋,對象的内容被掃描。注意C# IndexOf 方法與Visual Basic InStr 方法相同。如果找到搜尋關鍵字,目錄和檔案名被添加到窗體中的清單框中,程式傳回True。否則就是找不到比對選項,程式傳回False。

16. 最後,在Form1 Designer中,輕按兩下關閉按鈕然後在程式中添加下面的語句:
Close();
      
測試程式:
17. 在磁盤C或者是您選擇的任何位置上,建立一個名為WordDocuments 的檔案夾。
18. 複制SampleWordDocument.docx 文檔和AnotherSampleWordDocument.docx 文檔到WordDocuments 檔案夾中。
19. 打開Word 2007并且建立一個新的文檔。
20. 添加一些文本(不要包含Eagle)并且将文檔儲存在WordDocuments檔案夾下,名稱為SearchSampleDocument.docx 。
21. 按F5 運作此項目。
22. 在窗體中,在Search Directory 框中,輸入.docx 文檔的位置。
23.

在Search Term 框中,輸入Eagle,然後點選Search。

包含“Eagle”的兩個文檔顯示在清單框中,如圖6所示。SearchSampleDocument.docx 文檔沒有顯示。

圖6. 運作關鍵字搜尋的結果

24. 關閉視窗。

這就是您需要搜尋文檔的所有代碼,此種情況不需要使用Word 2007。您需要添加一些小功能:計算搜尋文檔的個數 ,添加替換功能,或者搜尋其它元件。

傳回頁首

結論

在這篇文章中,您熟悉了Office Open XML格式檔案的結構。您浏覽了檔案格式,同時示範了如何使用标準的XML和ZIP技術輕松的通路和編輯2007 Microsoft Office文檔。您也學習到了如何手動和編寫程式的方式操作Office Open XML 格式檔案。通過這些内容,您具備了為組織建立自定義應用程式的基礎