众所周知,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文件格式使得可以通过自定义功能区来重新调整用户界面,实现新增的功能。