简介
Microsoft Office Excel 2003 通过允许您将自己的 XML 架构定义 (XSD) 添加到工作薄,提高了对使用本机 XML 的支持。这样可以创
建一个 XML 映射,用于在导入或导出数据时使数据变得更有意义。因此,您可以导入符合自定义 XML 词汇或架构的数据,然后使用相同的
XML 架构将该数据写回去。
该功能面向 Office 解决方案开发人员,但专家用户也能够很好地使用它。该功能使您能够: •
在 Excel 电子表格和 XML 结构之间创建一个映射 •
使用该映射将后续 XML 数据导入到相同的结构 •
使用该映射将 XML 数据从该电子表格(符合该 XML 架构)中导出 •
对后续导入和导出操作保持并重新使用该映射
通过将一个 XSD 文件添加到 Excel 工作薄启动该过程。一旦您添加了 XSD 文件,Excel 会在 XML Source 任务窗格(请参见图 1)
中创建一个XML 映射,您可以将该映射用于特定范围或单个单元格。Excel 也可以使用该映射来管理那些映射范围和 XML 架构中元素
之间的关系。一个工作薄可以包含许多 XML 映射,其中每个映射都是一个独立的实体。同样地,对于同一个架构也可以有多个映射。
当您导入或导出 XML 数据时,Excel 使用该映射将一个映射范围的内容与该架构中的元素相关联。
注 一个映射必须包含单个根元素。如果您添加一个定义了多于一个根元素的架构,您必须选择单一根元素来使用该映射。
XML Source 任务窗格是一个可视工具,能够使 Office 解决方案开发人员快速设置知道如何在用户特定的架构中使用和生成 XML
数据的电子表格。
图 1. XML Source 任务窗格>
XML Source 任务窗格由一个树视图组成,能够使您挑选您所需的 XML 元素,并将其拖入逻辑分组中的单元格中或单独的表中。
让我们更详细地看看如何从 XML Source 任务窗格中使用 Excel 中的 XML 数据、架构和映射。您可以使用这些过程来检查后续方
案中的图形。将 XML 映射添加到工作薄
使用 XML 数据的第一步是将一个架构或映射添加到工作薄。
1.在 View 菜单上,单击 Task Pane 显示 XML Source 任务窗格。
-R- 在 Data 菜单上,指向 XML,然后单击 XML Source。
2.单击 XML Maps,然后单击 Add。
3.进入架构文件,单击 Open,然后单击OK。
这样附加了该架构,并将一个 XML 映射添加到工作薄。您现在可以将架构元素拖到电子表格上以映射它们。请注意,工作薄上没有添
加数据。您需要在通过映射所需的元素标记工作表之后,作为一个单独步骤将数据导入(请参阅以下部分)。
注 您可以向工作薄中添加多个架构。但是,单个电子表格范围只能容纳一个 XML 元素。两个或更多个 XML 元素之间不能有重叠。
图 1 显示了一个 XML Source 任务窗格,该窗格显示了一个带有 Root 的根节点的 XML 映射。Excel 在一个分层视图中显示了子元素。
1.单击 Options 以自定义映射,并切换映射边界。您可以选择在任务窗格中预览示例数据,在任务窗格中显示或隐藏帮助文本,并在映射时自动合并元素。您也可以在将重复元素映射到您的工作表时,指定将数据作为列标题使用。
2.单击 XML Maps 显示 XML Maps 对话框,该对话框可用于添加、删除或重新命名 XML 映射。
3.单击 Verify Map for Export 验证 Excel 是否可以使用当前选择的映射导出数据。 使用 XML Source 任务窗格进行映射
XML Source 任务窗格以树视图显示工作薄中的 XML 架构。您可以通过将元素拖到工作表上来映射元素,或者您也可以右键单击每个元素
并选择 Map element。您可以通过单击一个元素,按住 CTRL 键,并单击其他元素来选择非相邻元素。一旦您选择了元素,就可以将它
们拖到工作表中您希望它们出现的位置。如果该元素是一个重复元素,Excel 会在您添加该元素的单元格中创建一个 XML 列表。将数据导入映射的范围
现在让我们将 XML 数据导入映射的网格。
注 如果您在导入或导出的过程中使用一个 XSD 文件,默认情况下验证未打开。要打开验证或选择与 XML 映射器有关的其他选项,单击
Data 菜单,单击 XML,然后单击 XML Map Properties。
1.在您想导入 XML 数据的映射范围内选择一个单元格。
2.在 Data 菜单上,指向 XML,然后单击 Import。
3.在 Look in 列表中,单击包含您想导入的 XML 数据文件的驱动器、文件夹或 Internet 位置。
4.在该文件夹列表中,定位和打开包含该文件的文件夹。
5.单击该文件,然后单击 Import。 XML 映射方案
既然您看到了如何从架构创建一个映射,以及使用该映射将数据导入工作表,下面的部分将阐释如何将多种架构结构映射到网格中。
该架构的结构在您导入数据后,确定数据的映射和出现。下面的部分提供了几幅图,阐释了导入 XML 数据和 XSD 架构列表的结果。
对于每个方案,建议您执行以下操作:
1.使用文本编辑器(例如,记事本)将 XML 和 XSD 列表复制并粘贴到单独的文件中。
2.将 XSD 数据导入 XML Source 任务窗格以创建一个映射。
3.将该映射指定的元素(一个或多个)拖放到工作表单元格上。
4.从 XML 文件导入数据。
通过将这些架构与您自己的架构进行对比,您可以看到数据上某些架构的影响,或者在所需的地方进行调整,以便精细调整数据的
图形来满足您的需要。创建表格报表
用户界面
将 Row 或Root 元素放到单元格 B2(使用 XML Source 任务窗格)会产生下表:
图 2. 表格映射
XML 实例
<?xml version="1.0"?><Root xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance> <Row> <Column1>A</Column1> <Column2>B</Column2> <Column3>C</Column3> </Row> <Row> <Column1>X</Column1> <Column2>Y</Column2> <Column3>Z</Column3> </Row> </Root>
XSD
<?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="Root"> <complexType> <sequence> <element name="Row" maxOccurs="unbounded"> <complexType> <sequence> <element name="Column1" type="string" /> <element name="Column2" type="string" /> <element name="Column3" type="string" /> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema> 使用嵌套的元素
用户界面
将 Person 或Root 元素放到单元格 B3 上会产生下表:
图 3. 嵌套的元素映射
XML 实例
<?xml version="1.0"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Person> <FirstName>Janet</FirstName> <Middle>Q</Middle> <LastName>Leverling</LastName> <Address> <Address1>123 Elm</Address1> <Address2></Address2> <City>Pleasantville</City> <State>MA</State> <Zip>12345</Zip> </Address> </Person> <Person> <FirstName>Robert</FirstName> <Middle>Q</Middle> <LastName>Fuller</LastName> <Address> <Address1>123 Main</Address1> <Address2></Address2> <City>Mayberry</City> <State>MA</State> <Zip>12345</Zip> </Address> </Person> </Root>
XSD
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Root"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="unbounded" name="Customer"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Id" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Name" /> <xsd:element minOccurs="0" maxOccurs="1" name="Address"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="AddressLine" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="City" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="State" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="zip" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element minOccurs="0" maxOccurs="unbounded" name="Order"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Id" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Date" /> <xsd:element minOccurs="0" maxOccurs="unbounded" name="Product"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Name" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Quantity" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 创建开支报告样式表
用户界面
将 Meta元素放到单元格 B2 中,并将 ExpenseItem 元素放到单元格 B6 中会产生下表:
图 4. 开支报告映射
将 Root 元素放到单元格 B2 中将产生以下变化:
图 5. 开支报告映射上的变化
XML 实例
<?xml version="1.0"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Meta> <Name>Nancy Davolio</Name> <Date>2005-01-01</Date> <SAPCode>0001</SAPCode> </Meta> <ExpenseItem> <Date>2005-01-01</Date> <Description>Airfare</Description> <Amount>500</Amount> </ExpenseItem> <ExpenseItem> <Date>2005-01-01</Date> <Description>Hotel</Description> <Amount>200</Amount> </ExpenseItem> </Root>
XSD
<?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="Root"> <complexType> <sequence> <element name="Meta"> <complexType> <sequence> <element name="Name" type="string"/> <element name="Date" type="date"/> <element name="SAPCode"> <simpleType> <restriction base="positiveInteger"> <pattern value="[0-9]{4}" /> </restriction> </simpleType> </element> </sequence> </complexType> </element> <element name="ExpenseItem" maxOccurs="unbounded"> <complexType> <sequence> <element name="Date" type="date"/> <element name="Description" type="string"/> <element name="Amount"> <simpleType> <restriction base="decimal"> <pattern value="[0-9]+(.[0-9]{2})?"/> </restriction> </simpleType> </element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema> 创建关系表
用户界面
如果您将 Customer 或Root 元素放到单元格 A3 中,该网格将如下所示:
图 6. 关系表映射
您也可以通过以下操作创建三个单独的表: •
将 Customer 元素放到单元格 A3 中(只选择 Customer/Id、Customer/Name 和 Customer/Address)。 •
将 Order 元素放到单元格 A7 中(只选择 Customer/Order/Id 和 Customer/Order/Date)。 •
将 Product 元素放到单元格 A13 中(只选择 Customer/Order/Product/Name 和 Customer/Order/Product/Quantity)。
图 7. 关系表映射的多表视图
XML 实例
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Customer> <Id>1</Id> <Name>Janet Q. Leverling</Name> <Address> <AddressLine>123 Elm</AddressLine> <City>Pleasantville</City> <State>WA</State> <zip>12345</zip> </Address> <Order> <Id>1</Id> <Date>3/2/01</Date> <Product> <Name>Widget</Name> <Quantity>3</Quantity> </Product> <Product> <Name>Sprocket</Name> <Quantity>7</Quantity> </Product> </Order> <Order> <Id>2</Id> <Date>4/7/01</Date> <Product> <Name>Widget</Name> <Quantity>1</Quantity> </Product> </Order> </Customer> <Customer> <Id>2</Id> <Name>Nancy Davolio</Name> <Address> <AddressLine>123 Main</AddressLine> <City>Mayberry</City> <State>WA</State> <zip>12345</zip> </Address> <Order> <Id>3</Id> <Date>5/1/01</Date> <Product> <Name>Widget</Name> <Quantity>5</Quantity> </Product> <Product> <Name>Sprocket</Name> <Quantity>2</Quantity> </Product> </Order> <Order> <Id>4</Id> <Date>5/8/01</Date> <Product> <Name>Widget</Name> <Quantity>4</Quantity> </Product> </Order> </Customer> </Root>
XSD
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Root"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="unbounded" name="Customer"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Id" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Name" /> <xsd:element minOccurs="0" maxOccurs="1" name="Address"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="AddressLine" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="City" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="State" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="zip" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element minOccurs="0" maxOccurs="unbounded" name="Order"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Id" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Date" /> <xsd:element minOccurs="0" maxOccurs="unbounded" name="Product"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Name" /> <xsd:element minOccurs="0" maxOccurs="1" type="xsd:string" name="Quantity" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 创建多维表
用户界面
当您将 FlightReport 或Root 元素放到单元格 A3 中时,该单元格将如下所示:
图 8. 多维映射
XML 实例
<?xml version="1.0"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <FlightReport altitude="1000" weight="10000"> <Measurement> <Airspeed>350</Airspeed> <Vibration>125.6</Vibration> <Noise>62</Noise> <Drag>0.12</Drag> </Measurement> <Measurement> <Airspeed>400</Airspeed> <Vibration>99</Vibration> <Noise>75</Noise> <Drag>0.10</Drag> </Measurement> </FlightReport> <FlightReport altitude="2000" weight="10000"> <Measurement> <Airspeed>350</Airspeed> <Vibration>125.6</Vibration> <Noise>62</Noise> <Drag>0.12</Drag> </Measurement> <Measurement> <Airspeed>400</Airspeed> <Vibration>99</Vibration> <Noise>75</Noise> <Drag>0.10</Drag> </Measurement> </FlightReport> <FlightReport altitude="1000" weight="15000"> <Measurement> <Airspeed>350</Airspeed> <Vibration>125.6</Vibration> <Noise>62</Noise> <Drag>0.12</Drag> </Measurement> <Measurement> <Airspeed>400</Airspeed> <Vibration>99</Vibration> <Noise>75</Noise> <Drag>0.10</Drag> </Measurement> </FlightReport> <FlightReport altitude="2000" weight="15000"> <Measurement> <Airspeed>350</Airspeed> <Vibration>125.6</Vibration> <Noise>62</Noise> <Drag>0.12</Drag> </Measurement> <Measurement> <Airspeed>400</Airspeed> <Vibration>99</Vibration> <Noise>75</Noise> <Drag>0.10</Drag> </Measurement> </FlightReport> </Root>
XSD
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="Root">
<complexType>
<sequence>
<element name="FlightReport" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="Measurement" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="Airspeed" type="positiveInteger"/>
<element name="Vibration" type="decimal"/><
<element name="Noise" type="positiveInteger"/>
<element name="Drag">
<simpleType>
<restriction base="decimal">
<pattern value="[0-9]{1,2}.[0-9]{2}"/>
</restriction>
</simpleType>
</element>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="altitude" type="positiveInteger"/>
<attribute name="weight" type="positiveInteger"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
创建一个以属性为中心的映射
用户界面
当您将 FlightReport 或Root 元素放到单元格 A3 中时,该单元格将如下所示:
图 9. 以属性为中心的映射
XML 实例
<?xml version="1.0"?> <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Employees EmployeeId="1" FirstName="Janet" LastName="Leverling" Title="Sales Representative"/> <Employees EmployeeId="2" FirstName="Nancy" LastName="Davolio" Title="Technical Advisor"/> <Employees EmployeeId="3" FirstName="Robert" LastName="Fuller" Title="Accountant"/> </Root>
XSD
<?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="Root"> <complexType> <sequence> <element name="Employees" maxOccurs="unbounded"> <complexType> <attribute name="EmployeeId" type="positiveInteger"/> <attribute name="FirstName" type="string"/> <attribute name="LastName" type="string"/> <attribute name="Title"> <simpleType> <restriction base="string"> <enumeration value="Sales Representative"/> <enumeration value="Technical Advisor"/> <enumeration value="Accountant"/> </restriction> </simpleType> </attribute> </complexType> </element> </sequence> </complexType> </element> </schema>
显然,有像架构一样尽可能多的格式来创建它们。这里介绍这组格式化可能性的目的是,为您开发和精细调整您自己的架构提供一个起点。小结
架构使您能够指定哪些元素、属性、数据类型和层次结构允许在 XML 数据文件中出现。您可以使用架构文件验证 XML 数据,并在交换数据时
确保可预见性。由于该可预见性,您可以调整您的架构来确保数据可以正确显示。在 Excel 中,您使用 XML Source 任务网格将元素映射到
单元格。然后,将 XML 数据导入到一个最适合您需要的窗体是相对较容易的。