細品RibbonX(5):開放的XML文件格式

細品RibbonX(5):開放的XML文件格式

資料整理來自於論壇
完整版下載地址:http://download.csdn.net/download/nodeman/10264659

 Loading ...

 

衆所周知,Office 2007採用了新的文件格式。例如,在Excel 2007中,當您保存文件時會默認以xlsx爲擴展名來保存,採用這種格式的文件不包含宏;如果要保存帶有宏的工作簿,那麼應該以xlsm爲擴展名保存。(當然,您可以在Excel選項中更改保存文件時默認的文件格式)。
新的文件格式有:

  • xlsx:不帶有宏的工作簿文件。
  • xlsm:包含宏的工作簿文件。
  • xltx:不帶有宏的工作簿模板文件。
  • xltm:包含宏的工作簿模板文件。
  • xlsa:加載項文件。
  • xlsb:與舊的xls文件格式相同,但是可以兼容新特性的二進制文件。
  • xlsk:備份文件。

除xlsb文件外,其他的文件都是可以打開的XML文件,意味着其他文件可以讀寫這些文件。
Office 2007的新文件格式稱爲開放的XML文件格式,這是一種新的基於XML的文件格式。新的文件格式改進了文件和數據管理、數據恢復和可交互操作的能力。採用這種格式的文件實際上是壓縮文件,您可以將其解壓縮到文件夾中查看文件內部的情況。任何支持XML的應用程序都能訪問和處理Office 2007文件信息,即只要提供了對XML的支持,那麼非Office應用程序軟件也可以方便地創建和操縱Office文件。即便是在系統沒有安裝Office軟件的情形下,也可以查看文件的內容。
下面,主要以Excel 2007爲例,並使用Jan Karel Pieterse研究Excel 2007新的文件格式的工作簿示例,來了解Office 2007開放的XML文件格式。

探索Office 2007 XML文件格式
新的XML文件格式基於壓縮的ZIP文件格式規範,每個ZIP容器由許多包含Microsoft稱作"部件"的XML文件組成。大多數部件是描述工作簿數據、元數據、文檔信息的XML文件,非XML文件例如代表圖片或OLE對象的二進制文件也包含在ZIP文件中。也有描述部件之間關係的相關聯的部件,從而提供工作簿文件的結構,這些部件是工作簿的內容和內容部件如何組合在一起的關係詳情。
下面演示了開放的XML格式的文件容器。

分析Excel 2007文件
一個Excel 2007文件實際上就是一個壓縮了的容器(ZIP文件),其中包含一些文件夾和文件。您可以將Excel 2007文件的擴展名更改爲.zip或.rar,然後雙擊該文件來或者將其解壓縮到特定的文件夾中來查看其包含的文件夾和文件。在ZIP文件中,可以看到一些XML組件,其中一些獨立的XML文件存儲了文檔所有的設置(setting)、樣式(style)、繪圖(drawing)和數據等內容。
例如,新建一個Excel 2007工作簿,在該工作簿中輸入數據、插入圖表、放置控件和圖片及圖示、輸入VBA代碼等,然後將該工作簿命名爲test1.xlsm,關閉該工作簿。將工作簿test1.xlsm的擴展名更改爲test1.xlsm.zip,並解壓縮到文件夾中。可以看到其XML文件包結構如圖1所示。

圖1:Excel 2007的.xlsm文件的內容
該工作簿文件包含3個根文件夾和1個名爲[Content_Types].xml的文件。其中:

  • _rels文件夾:有一個名爲.rels的文件,包含關於程序包關係的信息。其中有三個關係屬性:Id爲任意字符串,在.rels文件中必須是唯一的;Type表示關係的類型;Target指定包含關係的目標的文件夾和文件。
    很多子文件夾內部都包含有一個名爲_rels的文件夾,這些文件夾都包含有定義與其他部分之間關係的XML文件。
    關係:Excel 2007文檔由部件組成。這些部件通過定義在不同的XML文件裏的關係聯繫在一起。
  • docProps文件夾:包含各種XML文件,描述文件屬性和應用程序設置。類似於單擊Office按鈕,選擇"準備——屬性"後看到的內容。docProps文件夾包含着至少一個名爲app.xml的文件和一個名爲core.xml的文件。這些文件包含着Excel文件的元信息,例如創建者的名字、修改的和創建的日期。
  • xl文件夾:包含文件的核心部分。根據工作簿中的內容,該文件夾中含有一些子文件夾,並且還含有工作簿設置的XML文件。如果工作簿中含有VBA代碼,那麼文件夾中還有以bin爲擴展名的二進制文件。
  • [Content_Types].xml文件:列出了包括在Excel文件程序包中其它部件的內容類型。

打開名爲"xl"的文件夾,其包含的內容如圖2所示。

圖2:文件夾"xl"中的內容
可以看出,除VBA工程、圖片等特殊情形以二進制格式存儲外,幾乎所有文件都是XML文件。下面列舉一些。

  • _rels:其中的關係文件workbook.xml.rels定義了工作簿、數據和格式部件的關係。
  • activeX:包含控件設置的XML文件。
  • charts:包含圖表設置的XML文件。
  • chartsheets:包含工作簿中每個圖表數據的XML文件。
  • diagrams:描述工作簿中形狀(SmartArt)的XML文件。
  • media:包含內嵌的媒體文件,例如GIF文件、JPG文件等。
  • tables:包含帶有每個表的數據的XML文件。
  • theme:包含工作簿主題的數據的XML文件。
  • worksheets:包含工作簿中每個工作表的XML文件。

除一些文件夾外,還有一些單獨的XML文件。例如,workbook.xml文件包含的部分內容如圖3所示。

圖3:文件"workbook.xml"包含的部分內容
在這個文件中,我們可以找到各個工作表對應的id號,即r:id。如果希望對某工作表進行操作,那麼先找到其r:id。例如,假設我們想在工作表Comments中添加內容,則需要找到包含該工作表內容的xml文件,即要找到圖3中工作表對應的r:id。在圖3中該工作表的r:id爲rId7。
在文件夾"_rels"中,包含着一個名爲"workbook.xml.rels"的文件,包含着XML代碼,如圖4所示。

圖4:在文件"workbook.xml.rels"中,指明Id值所對應的工作表
如圖4所示,名爲"sheet7.xml"的文件代表工作表"Comments"(rId7)。下圖5爲文件夾"worksheets"中的文件列表。

圖5:文件夾"worksheets"中的文件列表

使用壓縮包中的XML文件來操作Office文檔
讀取單元格的值
工作表"Comments"中的內容如圖6所示。

圖6:工作表Comments中的內容,單元格B2中包含批註
sheet7.xml文件的內容如圖7所示。

圖7:文件sheet7.xml中的內容,顯示了單元格A1、A2、A3
如何知道單元格A1中的內容呢?看看圖7中的內容:

<cr="A1"t="s">

,可以知道單元格A1中包含字符串(t="s")。下一行:

<v>28</v>

告訴我們需要在"xl"文件夾中名爲sharedStrings.xml的文件裏找到項目數值28。該文件頂部的內容如圖8所示。

圖8:文件sharedStrings.xml頂部的內容
表明在該工作簿中有45個唯一字符串。由於索引值是以0爲基數開始,圖7中的內容告訴我們需要的索引值是28,因此我們需要找到sharedStrings.xml文件中第29個

<si>

條目。如圖9所示。

圖9:文件sharedStrings.xml中的第29個si即爲工作表Comments中單元格A1的內容
在單元格中添加文本
現在,讓我們在工作表Comments中添加新的文本數據。首先,修改sharedStrings.xml文件頂部的字符串數,將圖8中的代碼修改如圖10所示。

圖10:將文件sharedStrings.xml頂部的字符串數修改爲46
接下來,在該文件中添加新字符串。在該文件的相應添加新字符串,如圖11所示。

圖11:在文件sharedStrings.xml中添加新字符串
然後,修改sheet7.xml文件,以添加帶有新字符串的行,如圖12所示。

圖12:在文件sheet7.xml中添加代碼以添加帶有新字符串的行
此時,工作表如圖13所示。

圖13:編輯XML文件後的結果
在單元格中添加數字
在單元格中添加數字與添加文本相似,但有兩點不同:數字是直接保存在工作表xml文件中並且可以添加數字格式。
例如,在前面的sheet7.xml文件中,數字單元格的格式爲"常規"並且沒有設置專門的格式。
通過索引值來定義單元格格式,例如下面的代碼表示在單元格A3中顯示的是日期:

<rowr="3"spans="1:2">

<cr="A3"s="34">

<v>39218</v>

</c>

</row>

索引值34指向文件包中的另一個文件:styles.xml,該文件的開始部分是自定義數字格式列表,下面一部分是稱作cellXfs的單元格格式交叉引用轉到自定義數字格式列表。在工作表xml文件中的s="34″指向該節點(cellXfs節點)的某一元素。由於索引值基於0,因此索引值34代表列表中的第35項(即最後一項),如圖14所示。

圖14:索引值34在列表中的項目
單元格格式交叉引用依次引用numFormatId列表、FontId列表、fillId列表以及borderId列表,都包含在Styles.xml文件中。
因此,不能直接添加格式化單元格到工作表,必須檢查特定的單元格格式組合是否已經存在於單元格格式交叉引用中(在styles.xml中),這涉及到要爲各個元素檢查所有單個的格式引用。同時,如果格式組合是新的,則必須擴展帶有新格式的格式元素列表,並更新樣式交叉引用。當然,也需要更新列表的所有"count"參數。
上文演示的示例工作簿下載:

改變窗體控件的屬性
通常,窗體控件與控件工具箱中的控件不同,例如不能改變按鈕的背景色、不能改變組合框的字體和顏色等。下面來探索如何利用工作簿文件包更改這些屬性。
例如,工作簿FormControls.xlsm的工作表Sheet1如圖15所示。

圖15:包含一些窗體控件的演示工作簿
現在,來分析這些窗體控件存放的位置。將工作簿FormControls.xlsm重命名爲FormControls.xlsm.zip。雙擊該文件,然後打開文件夾"xl",接着打開文件夾"worksheets"。打開"sheet1.xml"文件,可以找到如圖16中的條目。

圖16:文件sheet1.xml中指定窗體控件的條目
要找到"rId2",打開"_rels"文件夾,如圖17所示。

圖17:打開文件夾"_rels"
打開"sheet1.xml.rels"文件,找到rId2,如圖18所示。

圖18:文件"sheet1.xml.rels"中Id爲rId2的條目
這告訴我們應該查找文件"..\xl\drawings\vmlDrawing1.vml"。
每個工作表中有一個vmlDrawing?.vml文件,包含着控件或者在該vml文件中捕捉到的任何其它對象。
現在,將vmlDrawing1.vml文件拖到桌面上,然後打開它。找到定義複選框的部分,如圖19所示。

圖19:文件vmlDrawing1.vml中定義Excel工作表中複選框的部分
通常,我們不能改變窗體控件中複選框的字體。現在,讓我們在vmlDrawing1.vml文件中改變其字體,將圖19中的內容:

<spanstyle="color: #a00000; font-family: Arial Black;">CheckBox 3</span>

修改爲:

<spanstyle="color: #a00000; font-family: Courier New;">CheckBox 3</span>

保存並關閉該vml文件,然後將其拖回壓縮文件夾的drawings文件夾中,再將文件名稱FormControls.xlsm.zip改爲FormControls.xlsm。現在,打開工作簿FormControls.xlsm後,複選框如圖20所示。

圖20:修改字體後的窗體複選框控件
在這個vml文件中,還可以看出控件的其它信息,例如控件的大小和位置,即Anchor。如圖19中的內容:

<x:Anchor>4, 30, 2, 0, 8, 39, 3, 18</x:Anchor>

其中,前2個數字指定控件左上角的水平位置:第1個數字是所在列數(基於0),第2個數字代表控件基於該列左側的偏移量;隨後的2個數字指定控件左上角的垂直位置:第1個數字是所在行號(基於0),第2個數字代表控件基於該行頂部的偏移量;最後的4個數字指定控件的右下角的位置。
也就是說,在上面的xml中,控件的左上角位於列E、第3行、向右移29像素,右下角位於單元格I4,向右移38像素,相對於左上角下移18像素。
也可以改變複選框字體的顏色,將內容:

<spanstyle="color: #a00000; font-family: Courier New;">CheckBox 3</span>

修改爲:

<spanstyle="color: #ff0066; font-family: Courier New;">CheckBox 3</span>

修改後的效果如圖21所示。

圖21:修改窗體複選框控件中字體的顏色
上文演示的示例工作簿下載:

通過上面的介紹後,大家可以尋找並更改相關的xml文件內容,以實現在工作表界面中無法實現的操作。

結語XML是一種可擴展標記語言,可顯示任何平臺或應用程序可讀的數據,並且XML文件是一種簡單的文本文件,可以使用記事本創建,任何程序都可以很容易地從中讀取數據,而且這種文件格式也不易損壞。而Microsoft Office引入的新的開放的XML文件格式,就具備了這些優點。它使得我們可以使用其他應用程序軟件來讀取或編輯Office文檔,例如無須打開Excel就能修改工作簿、插入新工作表等。此外,與舊的二進制格式文件相比,新的文件格式也減少了工作簿損壞的機率,並且能夠根據文件包內的相關文件來修復文件,例如刪除或破壞了XML文件的一些字節後,在Excel中仍然可以讀取數據的其餘部分。使用新文件格式的文檔數據實際上是文本文件,這使得文件大小也比相應的二進制文檔要小。同時,文檔組織也是結構化的,因此可以提取其中單獨的元素。 還有很重要的一點是,新的XML文件格式使得可以通過自定義功能區來重新調整用戶界面,實現新增的功能。