与 XML 一起使用 Visual Basic 和 ASP 生成 Excel 2003 工作簿

Frank Rice
Microsoft Corporation

适用范围:
Microsoft® Office Excel 2003
Microsoft Visual Basic® 6.0
Microsoft Office Access 2003

摘要: 学习用于使用 XML 文件和 XML 样式表创建带格式的 Excel 工作簿的方法。通过使用 Active Server Pages (ASP) 或 Microsoft Visual Basic 创建的 XML 模板,使您可以灵活地选择创建模板的、且最符合目标要求的方法。

本页内容

引言 引言
XML 的定义 XML 的定义
XML 样式表的定义 XML 样式表的定义
XML 文件的转换 XML 文件的转换
XML 平面化 XML 平面化
XML 样式表的优点 XML 样式表的优点
XML 映射 XML 映射
XML 电子表格 (XMLSS) 格式 XML 电子表格 (XMLSS) 格式
在 Excel 解决方案中集成 XML 在 Excel 解决方案中集成 XML
在流式传输 MIME 内容过程中为 Excel 工作簿设置格式 在流式传输 MIME 内容过程中为 Excel 工作簿设置格式
使用 Visual Basic 或 ASP 为工作簿创建 XML 模板 使用 Visual Basic 或 ASP 为工作簿创建 XML 模板
使用 ASP 将 XML 保留的 ADO 记录集转换为 XML 电子表格 使用 ASP 将 XML 保留的 ADO 记录集转换为 XML 电子表格
结论 结论

引言

可以使用 Microsoft® Office Excel 2003,以可扩展标记语言 (XML) 格式打开、转换和保存文件。本文回顾了 XML 和 XML 样式表以及如何将其与 Excel 2003 一起使用。除了如何使用 Active Server Pages (ASP) 和 Microsoft Visual Basic® 创建带格式的 Excel 工作簿、如何创建 XML 模板并且此模板在用于 XSL 转换时生成一个可以直接在 Excel 中打开的带格式的工作簿之外,本文还提供了关键词和关键概念的定义。

注意: 本文是对 Microsoft 知识库的各种文章的合并和更新。有关详细信息,请在 Microsoft 知识库中搜索词“XML”和“Excel”。

XML 的定义

XML 是一个用于分隔文本数据的简单、标准的方法。它类似于创建任意数据结构并且该结构可以轻松地读取数据,然后将其与在任何其他计算平台上、使用任何语言的任何人共享。因为使用 XML 可以轻松地进行创建和解释,因而它所应用的程序范围很广。XML 很正确,即格式正确;它遵循一组指导原则,这些原则规定数据结构但使 XML 开发人员可以非常灵活、不限数量地创建可以更好地描述数据以及数据中可能存在的关系的自定义标记。

和超文本标记语言 (HTML) 一样,XML 也是一种标记语言,其中文本与一组标记(文字置于尖括号 < 和 > 之中)及属性(格式名称=“值”)组织在一起。然而,HTML 指定每个标记和属性的含义以及应如何提供它以用于显示,而 XML 仅使用标记描述数据元素。因为可以和 XML 一起使用任何标记名称,因而仅由程序决定如何解释数据及其含义。尽管 XML 开发人员可以随意创建适用于其数据的任何标记或层次结构,但是应遵守一组规范以确保 XML 格式正确。

odc_XLxmlhowto01_thumb

图 1. XML 文档的各部分

构成 XML 文档的语法如下:

  • 序言。表示 XML 数据的开始,说明字符编码方法并提供 XML 分析器和应用程序的其他信息。序言包括一个可选的 XML 声明、零个或多个注释、处理指令和空格字符。

  • XML 声明。所有的 XML 文档都可以(并应该)使用一个 XML 声明来开始。XML 声明说明有一个 XML 文档并提供版本号。

  • 注释。用于增强文档可读性的可选实体。可以在 <!-- 和 --> 字符之间键入“--”之外的字符。

  • 处理指令。将指令(例如,如何处理元素或其内容)传递给应用程序。

  • 属性。提供用于在元素中包含其他信息的另一种方法。通常情况下,将要显示的大多数信息存储在元素的上下文中。然后,将元素的各种特性(不一定要显示)存储在一个属性中。

  • 文档元素(根元素)。XML 文档中所有其他元素的父元素,意味着它可能没有包含在任何其他元素中。

我们已说明了 XML 文档的各部分,构成一个格式正确的文档的特征如下:

  • 它仅包含一个具有唯一名称的根元素,并且不会出现在文档中的其他任何元素中。

  • 元素正确嵌套以便在元素之间没有任何重叠的标记。

  • 所有元素的标记都是闭合的。

  • 元素的开始和结束标记所用的大小写保持一致(XML 区分大小写)。

  • 所有元素属性都由引号括起来,无论是双引号还是单引号。

  • 特殊字符(例如 &、<、>)都定义为内置实体(&、<、>)。

列表 1. 格式正确的 XML 示例 (Dictionary.xml)

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Dictionary.xsl"?>
<Dictionary>
 <Entries>
    <Entry>
      <Word Type="1">精力充沛的</Word>
      <Definition>具有、发挥或显示精力</Definition>
    </Entry>
    <Entry>
      <Word Type="1">高兴的</Word>
      <Definition>享受、显示高兴或快乐,或以高兴或快乐为特征</Definition>
    </Entry>
    <Entry>
      <Word Type="2">情绪</Word>
      <Definition>一种复杂、强烈的主观反应</Definition>
    </Entry>
 </Entries>
</Dictionary>

列表 1 中的 XML 说明了字典中的条目。根元素是 <Dictionary>,并且根元素包含一个名为 <Entries> 的子元素。<Entries> 包含三个子元素,其中每个子元素都描述了字典中单独的一个条目。每个条目有两个子元素:<Word> 和 <Definition>。每个 <Word> 元素的值就是单词本身,<Word>。元素还具有一个 Type 属性,它说明该单击是形容词 (1) 还是名词 (2)。<Definition> 元素具有文本值并且没有属性。

XML 样式表的定义

XML 标记在文本文件中描述数据,但是 XML 自己并不指定如何向用户显示数据。XML 数据的设置格式规则通常包含在 XML 样式表中。XML 样式表是格式正确的 XML 文档,它使用可扩展样式语言 (XSL) 转换 XML 数据以备显示。相同的 XML 数据可以具有许多样式表。尽管实际的 XML 数据结构可能会相同,但是样式表使您可以灵活地将数据以许多不同的方式进行显示。以下示例说明如何通过使用 XML 标记为字典条目设置格式:

列表 2. XML 样式表 (Dictionary.xsl)

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">

    <html>
      <body>
        <ul>
          <xsl:for-each select="Dictionary/Entries/Entry">
            <li>
              <B><xsl:value-of select="Word"/></B>
              <xsl:if test="Word[@Type='1']"><I>adj.</I></xsl:if>
              <xsl:if test="Word[@Type='2']"><I>n.</I></xsl:if>
              <BR/>
              <xsl:value-of select="Definition"/>
              <BR/><BR/>
            </li>
          </xsl:for-each>
        </ul>
      </body>
    </html>
 </xsl:template>
</xsl:stylesheet>

列表 2 中显示的 Dictionary.xsl 是一个可用于转换示例 Dictionary.xml 的样式表。该转换会使数据显示为 HTML 格式,它可以在 Web 浏览器中查看。XSL 按字母顺序并以项目符号列表形式为字典条目排序,并为字典条目的每个组件设置格式。显示在浏览器中的转换后的 XML 的外观与下面类似:

  • 情绪<名>一种复杂、强烈的主观反应

  • 精力充沛的<形>具有、发挥或显示精力

  • 高兴的<形>享受、显示高兴或快乐,或以高兴或快乐为特征

如果想试试,将列表 1 复制并粘贴到任何文本编辑器并将其保存为 Dictionary.xml。然后,复制并粘贴列表 2 中 XML 样式表,将其保存在 Dictionary.xml 保存至的文件夹并将其命名为 Dictionary.xsl。启动 Microsoft Internet Explorer 并导航到 Dictionary.xml。

XML 文件的转换

Excel 可以打开任何格式正确的 XML 文件。可以使用“文件”菜单的“打开”命令直接打开 XML 文件。也可以通过使用 Workbooks 集合的 Open 方法或 OpenXML 方法,以编程方式打开 XML 文件。另外,可以通过使用“列表”工具栏上的“导入 XML 数据”按钮,来导入 XML 文件。最后,可以通过单击“数据”菜单,指向“XML”,然后“导入”,来打开 XML 文件。

XML 平面化

在 Excel 中,如果将 XML 导入为只读的工作簿,Excel 会使用特殊的平面化算法将数据加载到行和列中。Excel 工作表是由行和列构成的二维实体;因为 XML 可以不仅只具有二维,因而解释 XML 时需要平面化,这样 Excel 可以将其加载到工作表的单元格。

考虑以下两组 XML,从根本上而言它们以不同方式表示相同的数据:

列表 3. 具有子元素的客户 XML

<?xml version="1.0"?>
<Customer>
    <CustomerID>1234</CustomerID>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
</Customer>

<?xml version="1.0"?>
<Customer CustomerID="1234" FirstName="John" LastName="Doe"/>

列表 4. 具有属性的客户 XML

<?xml version="1.0"?>
<Customer CustomerID="1234" FirstName="John" LastName="Doe"/>

如果将列表 3 中的 XML 加载到 Excel,则数据会按如下方式导入到单元格:

表 1. 已平面化的、列表 3 中的 XML

行/列

A

B

C

1

/Customer

 

 

2

/Customerid

/FirstName

/LastName

3

1234

John

Doe

看一看列表 3 和列表 4,Excel 处理属性的方式和处理子元素的方式完全相同。为了防止名称和现有元素发生冲突,Excel 在属性名称之前放置“位于”符号 (@),以便和 XSL 模式的命名标准保持一致。这样,列表 4 中的 XML 将以相同的方式加载到单元格(通过使用“文件”菜单中的“打开”菜单将获取的文件加载为“作为只读 Excel 工作簿”),除了单元格 A2、B2 和 C2 各自包含“/@CustomerID”、“/@FirstName”和“/@LastName”之外。

列表 3 和列表 4 中的 Customer.xml 文件遵循易于查看的二维结构。但是请考虑以下的 Customer.xml(列表 5),它由于添加 <Order> 级别,因而无法轻松地解释为二维:

列表 5. 根元素下具有两个级别的客户 XML

<?xml version="1.0"?>
<Customers>
   <Customer>
      <CustomerID>1234</CustomerID>
      <FirstName>John</FirstName>
      <LastName>Doe</LastName>
      <Orders>
         <Order ProdID="AAA" Amt="10"/>
         <Order ProdID="BBB" Amt="3"/>
      </Orders>
   </Customer>
   <Customer>
      <CustomerID>5678</CustomerID>
      <FirstName>Alice</FirstName>
      <LastName>Smith</LastName>
      <Orders>
         <Order ProdID="AAA" Amt="5"/>
      </Orders>
   </Customer>
</Customers>

在列表 5 中的 XML,有一个客户具有两个订单,而另一个客户具有一个订单。Excel 必须以一种可以维护 <Orders> 和 <Customers> 之间关系的方式,导入 XML。Excel 将 XML 导入到以下三行中:

odc_XLxmlhowto02_thumb

图 2. 具有多维表示的电子表格

另外的两个列为:一个将行与 <Customer> 节点相关联的 #id 列,一个表示“FillDown”的 #agg 列。使用 #agg,它上一个级别中的第一个节点的值被列出一次,然后在其他行中省略。

并且请注意,<Amt> 的列在 <ProdID> 的列之前,即使在实际的 XML 中,<Amt> 的列显示在 <ProdID> 之后也一样。平面结构会按字母顺序从左到由加载元素,而不是按照元素显示在原始 XML 文档中的自然顺序进行加载。

XML 样式表的优点

使用样式表提供用于在 Excel 中打开 XML 文件的重要优点。通过使用样式表,可以更好地控制数据在单元格中的放置,甚至为单元格提供某些格式。如果在 Excel 中打开 XML 文件,并且此文件包含一个或多个 XML 样式表的处理指令,则 Excel 提示您选择要在转换时使用的样式表。

请再次考虑列表 5 中的 Customer.xml。通过将处理指令添加到 Customer.xml (<?xml-stylesheet type="text/xsl" href="Customer.xsl"?>),可以控制显示该数据的工作表中的列并可以应用自定义的格式。可以将以下的样式表示例用作 Customer.xml 示例的转换:

列表 6. 客户 XSL 样式表

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">

    <HTML>
      <HEAD>
        <STYLE>   
          .HDR { background-color:bisque;font-weight:bold }
          .CustomerRow { border-top:thin solid black }
        </STYLE>
      </HEAD>
   
      <BODY>
        <TABLE>
          <COLGROUP WIDTH="100" ALIGN="CENTER"></COLGROUP>
          <COLGROUP WIDTH="100" ALIGN="LEFT"></COLGROUP>
          <COLGROUP SPAN="2" WIDTH="80" ALIGN="CENTER"></COLGROUP>
          <TD CLASS="HDR">客户 ID</TD>
          <TD CLASS="HDR">名称</TD>
          <TD CLASS="HDR">产品 ID</TD>
          <TD CLASS="HDR">数量</TD>
          <xsl:for-each select="Customers/Customer">
            <TR>
              <TD CLASS = "CustomerRow">
                <xsl:value-of select="CustomerID"/>
              </TD>
              <TD CLASS = "CustomerRow">
                <xsl:value-of select="FirstName"/> <xsl:value-of 
      select="LastName"/>
              </TD>
              <TD CLASS = "CustomerRow">
                <xsl:value-of select="./Orders/Order/@ProdID"/>
              </TD>
              <TD CLASS = "CustomerRow">
                <xsl:value-of select="./Orders/Order/@Amt"/>
              </TD>
            </TR>
            <xsl:for-each select="./Orders/Order">

                <TR>
                  <TD> </TD><TD> </TD>
                  <TD><xsl:value-of select="@ProdID"/></TD>
                  <TD><xsl:value-of select="@Amt"/></TD>
                </TR>
 
            </xsl:for-each>
          </xsl:for-each>
        <TR><TD CLASS="CustomerRow" COLSPAN="4"> </TD></TR>
        </TABLE>
      </BODY>
    </HTML>
 </xsl:template>
</xsl:stylesheet>

样式表将 XML 转换为有效的 HTML。Excel 可以将有效的 HTML 转换为其本机格式。打开已应用样式表的客户 XML 时,Excel 将数据显示为带有标题(“客户 ID”、“名称”、“产品 ID”和“数量”)的四列的表格。单元格格式(例如,字体属性、单元格背景颜色和边框)也显示在该表中。如果想试试,将列表 5 中的 XML 复制并粘贴到任何文本编辑器并将其保存为 Customer.xml。然后,复制列表 6 中的 XML 样式表,将其保存在 Customer.xml 保存至的文件夹并将其命名为 Customer.xsl。启动 Internet Explorer 并导航到文件 Customer.xml。在图 3 中,请注意该文件已设置格式。

odc_xlxmlhowto03

图 3. 带格式的 Customer.xml 文件

下面,从 Customer.xml 中删除处理指令 ( <?xml-stylesheet type="text/xsl" href="Customer.xsl" ?> ),并在 Internet Explorer 中打开该文件。现在可以看到带格式的 Customer.xml 文件和不带格式的 Customer.xml 文件(请参阅图 4)之间的区别。

odc_xlxmlhowto04

图 4. 带格式的 Customer.xml 文件

XML 映射

注意: 以下功能仅可以在 Excel 2003 独立程序和 Microsoft Office 2003 Professional Edition 中获取。Microsoft Office 2003 Standard Edition 中不提供此功能。

Microsoft Excel 2002(从 Microsoft Office XP 中可获取)中引入了用于在 XML 电子表格架构中打开、编辑并保存 XML 文件的功能。Excel 2003 扩展了此功能,使您可以通过在 Excel 工作簿中使用 XML 数据的用户定义的映射,来在任何预定义的 XML 架构 (*.XSD) 中打开、编辑并保存任何 XML 数据。

在 Excel 2003 中,可以将 XML 架构映射到 Excel 工作簿。映射时,可以从任何符合映射架构的 XML 源中导入数据。另外,此文件可供工作簿使用;可以通过使用 Excel 2003 列表界面显示映射的元素和后续导入的数据。

将 XML 架构添加到工作簿时,Excel 会创建一个指定为 XML 映射的对象。使用 XML 映射,可以将单元格或范围映射到 XML 架构的元素。Excel 也使用这些映射,来在导入或导出 XML 数据时将映射范围中的内容和架构中的元素相关联。一个工作簿可以包含许多 XML 映射,其中映射相互之间保持独立。但是,多个映射可以指向相同的基础架构。

Excel 显示数据结构的树状层次表示。然后可以将树状表示中的不同元素映射到工作表中的真正单元格中。架构可以通过分层结构方式来约束数据,或架构可以进一步约束数据类型和从工作表中提取或导入到工作表中数据的其他方面。

另外,可以将 XML 数据从映射工作簿导出到其原架构,只要映射元素中的所有数据符合架构并可以导出即可。未映射的架构的元素不可以导出。

有关将 XML 映射到工作簿的其他信息,请参阅以下文章:

如果尝试打开的 XML 文件的结构不正确,则会收到一个错误信息或脚本分析错误。错误信息说明 XML 无法打开的原因。错误信息说明可能也会提供导致转换失败的节点的详细信息。在发生分析错误的某些情况下,可能会收到一个对话框,从中列出错误而不是错误信息;Excel 将脚本分析错误记录到日志文件。分析错误信息列出日志文件的位置和名称。

打开 XML 文件时可能会显示文本导入向导。XML 文件仅仅是一个结构非常特殊的文本文件。要使 Excel 识别打开的文件是 XML 文件而不是纯文本,XML 文件中的第一个条目必须为一个至少包含保留名“xml”和版本号的 XML 声明。XML 也必须至少包含一个元素(根元素),在本例中,为 <MyXML> 元素:

列表 7. XML 文档中的根元素

<?xml version="1.0"?>
<MyXML>
....
</MyXML>

XML 电子表格 (XMLSS) 格式

Excel 可以将工作簿保存为 XML。可以通过在“保存为”对话框中选择“XML 表格(*.xml)”作为文件类型,来将工作簿保存为 XML。Excel 将工作簿保存为 XML 电子表格 (XMLSS) 格式。

注意: 如果选择“XML 数据(*.xml)”作为文件类型,则 Excel 仅导出映射为架构的范围内的 XML 数据(如本文中“XML 映射”部分中介绍的一样);如果没有架构映射到工作簿,则将收到一个错误信息。

XML 电子表格格式通过保留单元格数据和公式、单元格格式、工作表设置和工作簿设置,来说明工作簿的内容。以下 Excel 功能无法保留在 XML 中:

  • 图表

  • OLE 对象

  • 绘制图形或自选图形

  • VBA 项目

  • 组和大纲

XMLSS 是一种通用于 Excel 2003 和 Excel 2002 的格式。因而,可以将 XMLSS 格式的文件在两个版本之间共享。也可以创建 XMLSS 文件将数据转换为另一种格式时使用的自己的样式表。这样,可以和任何数量的程序共享转换的文件。

在 Excel 解决方案中集成 XML

使用 XML 数据为您提供许多用于 Excel 2003 解决方案的机会。例如,可以在运行时创建 XMLSS 格式的多表工作簿,而无须自动化 Excel。自动化 Excel 需要加载 Excel 的可执行文件。因为 Excel 是一个进程外的自动化服务器,因而对 Excel 对象模型的调用在性能方面可能会占用很多内存。

可以通过仅使用 Microsoft XML 分析器 (MSXML) 和 XML 样式表,即可完全在进程内创建 XMLSS。或者,可以使用 Office XP 电子表格组件(进程内),来建立电子表格并为电子表格检索 XMLSS。在任何一种情况下,都可以在 Excel 中将得到的 XMLSS 直接打开为本机格式。通过使用 Excel 中的多用途 Internet 邮件交换 (MIME)(也称作多媒体 Internet 邮件交换)内容类型将 XMLSS 传入客户端浏览器,Web 程序(例如,那些使用 ASP 的程序)可以创建复杂的工作簿,而无需在服务器上运行 Excel 的开销。

注意: MIME 是设置非 ASCII 信息格式并使其可以通过 Internet 进行发送的规范。许多电子邮件客户端现在支持 MIME,它使客户端可以通过 Internet 邮件系统发送并接收图形、音频和视频文件。除了电子邮件应用程序,Web 浏览器也支持多种 MIME 类型。这样,浏览器可以显示或输出非 HTML 格式的文件。其中的一个文件类型包含工作簿。

对于说明 XMLSS 生成的可能使用方式的示例代码,请参阅以下 Microsoft 知识库文章:

以一种可以轻松地与其他程序共享的格式从单元格范围中提取数据,是 Excel 解决方案中的 XML 的另一种可能使用方式。可以通过使用 <xlRangeValueXMLSpreadsheet> 参数调用 Range 对象的 Value 属性,来从工作表中的单元格提取 XMLSS。可以使用样式表,将 XMLSS 转换为任何可以与其他程序一起使用的 XML。一种可能的使用方式是,将 XMLSS 转换为可以通过使用 Web 程序发布和处理的自定义 XML。

在流式传输 MIME 内容过程中为 Excel 工作簿设置格式

本部分说明了如何使用 ASP 创建可以作为 MIME 内容流式传输到 Microsoft Excel 的带格式工作簿。

Excel 2003 可以将存储信息保留为 HTML/XML 混合格式。如果将 Excel 2003 工作簿保存为网页,Excel 会创建一个包含对于 Excel 具有特殊意义的 HTML 标记和 XML 标记组合。保存为此格式的工作簿可以从 Excel 到浏览器并再返回到 Excel(往返传递),同时不会失去工作簿完整性。

如果在 Internet Explorer 中打开一个保存为网页的工作簿,则 HTML 标记将显示文档。如果在 Excel 中以这种格式打开工作簿,则 Excel 使用 XML 标记用于工作簿、工作表、行和列的相关设置。

通过使用 ASP,可以在 Excel 中创建自己的 HTML/XML 格式的文档,这样在将文档流式传输到客户端浏览器时,该文档会使用 Excel 进行显示。使用 HTML/XML 格式,控制数据的单元格放置并指定 Excel 中支持的任何工作簿或工作表。

要创建 HTML/XML 格式的 Excel 工作簿,并将其作为 MIME 内容流式传输到客户端的 Excel,则请执行以下步骤:

  • 将以下代码粘贴到 Microsoft 记事本:

    列表 8. 为 Excel 工作簿设置格式并将其以 MIME 格式进行流式传输的过程

    <%@ Language=VBScript %>
    

<% ' 检查地址栏中是否传递值。 if (Request.QueryString("i")) = "" then bFirst = true ' 如果具有 "i" 的值,我们知道可以 ' 在 Excel 中显示数据。 if (bFirst = false) then ' 缓冲内容并将其发送到 Excel。 Response.Buffer = true Response.ContentType = "application/vnd.ms-excel" %> <HTML xmlns:x="urn:schemas-microsoft-com:office:excel"> <HEAD> <style> <!--table @page {mso-header-data:"&CMultiplication Table\000ADate: &D\000APage &P"; mso-page-orientation:landscape;} br {mso-data-placement:same-cell;}

--> </style> <!--[if gte mso 9]><xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <x:Name>Sample Workbook</x:Name> <x:WorksheetOptions> <x:Print> <x:ValidPrinterInfo/> </x:Print> </x:WorksheetOptions> </x:ExcelWorksheet> </x:ExcelWorksheets> </x:ExcelWorkbook> </xml><![endif]--> </HEAD> <BODY> <TABLE> <% ' 建立一个从 1,1 到 i,j 的乘法运算表。 for i = 1 to CInt(Request.QueryString("i")) Response.Write " <TR>" + vbCrLf for j = 1 to CInt(Request.QueryString("j")) if (j = 1) or (i = 1) then Response.Write " <TD bgcolor=""#FFF8DC"">" else Response.Write " <TD bgcolor=""#B0C4DE"">" end if Response.Write CStr(i*j) + "</TD>" + vbCrLf next Response.Write " </TR>" + vbCrLf next %> </BODY> </HTML> <% else ' 用户尚未加载该页。提醒用户 ' 为表输入值。 %> <HTML> <BODY> Please enter indices for the multiplication table:<BR> <FORM action="xlmime.asp" method=GET>
i = <INPUT type="text" name=i style="WIDTH: 25px"><BR> j = <INPUT type="text" name=j style="WIDTH: 25px"><BR><BR/> <INPUT type="submit" value="Submit"><BR/> </FORM> </BODY> </HTML> <% end if %>

  • 将文件命名为 XLMime.asp 并将其保存在 Web 服务器的虚拟根目录中。(默认的虚拟根为 C:\Inetpub\Wwwroot。)

  • 启动 Internet Explorer 并浏览到 http://Server_Name/xlmime.asp,其中 Server_Name 是 Web 服务器的名称。

    odc_xlxmlhowto05

    图 5. xlmime.asp 文件的介绍屏幕

  • 在显示的网页中(请参阅图 5),为所提供的每个文本框提供数字值,然后单击“提交”。使用新的工作簿在浏览器中激活 Excel。新的工作簿(请参阅图 6)包含所指定的、位于行编号为 (i) 而列编号为 (j) 的带格式的数据。而且,如果检查工作表的页面设置信息,则会发现方向设置为横向并且存在自定义标题。

    odc_xlxmlhowto06

    图 6. 生成的带格式屏幕

使用 Visual Basic 或 ASP 为工作簿创建 XML 模板

这一部分说明了如何创建一个 XML 模板,该模板用于 XSL 转换时生成可以在 Excel 中直接打开的带格式的工作簿。既为 ASP 说明 XML 转换,也为 Visual Basic 说明 XML 转换。对于 Visual Basic 代码示例,Excel 仅使用 XML/XSL 生成电子表格数据;此示例使用最少的自动化来在 Excel 中打开结果。

  1. 创建一个文件夹,即 C:\ExcelXML。

  2. 在 Excel 中,创建一个工作簿。

  3. 将以下工作簿中单元格 A1:F2 中的数据添加到指定的单元格中。将单元格 F2 数据作为公式进行添加。

    A1:订单 ID

    B1:产品 ID

    C1:单价

    D1:数量

    E1:折扣

    F1:总数

    A2:aaa

    B2: 111

    C2: 222

    D2: 333

    E2: 0

    F2:=C2*D2*(1-E2)

    表 2. 工作簿的示例数据

  4. 在单元格 F3 中,键入以下公式:

    =SUM(F$2:F2)
    
  1. 选择单元格 A1:F1

  2. 在“格式”菜单中,单击“单元格”。

  3. 应用粗体、底边框并为单元格底纹应用纯色。单击“确定”。

  4. 选择列 A:F

  5. 在“格式”菜单中,指向“列”并单击“列宽”。

  6. 键入 15 作为新的列宽,然后单击“确定”。

  7. 在列 A:F 仍处于选中状态下,在“格式”菜单中,单击“单元格”。

  8. 在“对齐”选项卡中,从水平对齐列表中选择“居中”,然后单击“确定”。

  9. 选择列 E。在“格式”菜单中,单击“单元格”。

  10. 在“数字”选项卡中,单击“百分比”并指定 0 小数位数,然后单击“确定”。

  11. 选择列 F

  12. 在“格式”菜单中,单击“单元格”。

  13. 在“数字”选项卡中,单击“会计专用”,然后单击“确定”。

  14. 选择单元格 A3:F3

  15. 在 “格式”菜单中,单击“行”,再单击“行高”,键入 25,然后单击“确定”。

  16. A3:F3 仍处于选中状态下,在“格式”菜单中,单击“单元格”。

  17. 为单元格应用顶边框,然后单击“确定”。

  18. 在“工具”菜单中,单击“选项”。

  19. 在“视图”选项卡中,清除“网格线”复选框,然后单击“确定”。

  20. 选择行 2。在“窗口”菜单中,单击“冻结窗格”。

  21. 选择单元格 A1

  22. 在“文件”菜单上,单击“另存为”。

  23. 浏览到创建的 C:\ExcelXML 文件夹,然后将工作簿命名为 Orders.xsl 并将其保存为 XML 电子表格格式。

    **注意:**在“另存为”对话框的“文件名”框中,将文件名置于双引号之中,这样 Excel 则不会为文件名添加 .xml 扩展名。

  24. 退出 Excel。

  25. 在任何文本编辑器(例如,记事本)中打开 Orders.xsl。

  26. 将以下部分插入到 <?xml version="1.0"?> 和 <Workbook> 标记之间:

    <xsl:stylesheet version="1.0" 
    

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:pi name="xml">version="1.0"</xsl:pi>

  1. 在 Orders.xsl 的末尾,追加以下两行:

    </xsl:template>
    

</xsl:stylesheet>

  1. 将以下的标记集放置在 Orders.xsl 中(该标记集表示工作表中的单元格 A2:F2)

    <Row ss:Height="14.25">
    

<Cell><Data ss:Type="String">aaa</Data></Cell> <Cell><Data ss:Type="Number">111</Data></Cell> <Cell><Data ss:Type="Number">222</Data></Cell> <Cell><Data ss:Type="Number">333</Data></Cell> <Cell><Data ss:Type="Number">0</Data></Cell> <Cell ss:Formula="=RC[-3]*RC[-2]1(1-RC[-1])"><Data ss:Type="Number">73926</Data></Cell> </Row>

**注意:** Height 属性可能随着步骤 8 中应用的边框设置的变化而变化。
  1. 将前面的代码替换为下面的 XSL 代码

    <xsl:for-each select="xml/rs:data/z:row">
    

<Row ss:AutoFitHeight="0" ss:Height="13.5"> <Cell><Data ss:Type="String"><xsl:value-of select="@OrderID"/></Data></Cell> <Cell><Data ss:Type="Number"><xsl:value-of select="@ProductID"/></Data></Cell> <Cell><Data ss:Type="Number"><xsl:value-of select="@UnitPrice"/></Data></Cell> <Cell><Data ss:Type="Number"><xsl:value-of select="@Quantity"/></Data></Cell> <Cell><Data ss:Type="Number"><xsl:value-of select="@Discount"/></Data></Cell> <Cell ss:Formula="=RC[-3]RC[-2](1-RC[-1])"><Data ss:Type="Number">0</Data></Cell> </Row> </xsl:for-each>

  1. 将所作更改保存到 Orders.xsl,并关闭此文件。

使用 Visual Basic 将 XML 保留的 ADO 记录集转换为 XML 电子表格

  1. 在 Visual Basic 中,创建一个标准的 EXE 项目。

  2. Project(项目)菜单中,单击 References(引用)。选择 Microsoft ActiveX 数据对象 2.5(或更高版本)和 Microsoft XML 3.0 的类型库。

  3. 将 CommandButton 添加到 Form1 中,并将以下代码添加到按钮的 Click 事件中:

    列表 9. 使用 Visual Basic 将 ADO 记录集转换为 XML 电子表格的过程

        Const sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
         "C:\program files\microsoft office\office11\samples\Northwind.mdb"
    Const sOutXML = "C:\ExcelXML\Orders.xml"
    Const sXSL = "C:\ExcelXML\Orders.xsl"
    
    '检索 Northwind 中 Orders Detail 表的 ADO 记录集。
    Dim nRecords As Long, nFields As Long
    Dim rs As New ADODB.Recordset
    rs.Open "SELECT * FROM [Order Details]", sConn, adOpenStatic, adLockOptimistic
    
    '将此记录集保留为新的 DOMDocument,并存储记录计数.
    Dim oXML As New DOMDocument
    rs.Save oXML, adPersistXML
    nRecords = rs.RecordCount
    nFields = rs.Fields.Count
    rs.Close
    
    '将 XSL(使用 XSL 指令的工作簿模板)加载到 DOMDocument 中。
    Dim oXSL As New DOMDocument
    oXSL.Load sXSL
    
    '使用样式表转换 XML。
    Dim oResults As New DOMDocument
    oXML.transformNodeToObject oXSL, oResults
    
    If oXSL.parseError.errorCode <> 0 Then
        MsgBox "Parse Error: " & oResults.parseError.reason
    Else
       '修改 <table> 节点的 ss:ExpandedRowCount 属性,
       '以便表示正确的行数(记录数 + 1 行得到
       '标题 + 1 行得到总数)。
        Dim oTable As MSXML2.IXMLDOMElement
        Set oTable = oResults.selectSingleNode("Workbook/Worksheet/Table")
        oTable.setAttribute "ss:ExpandedRowCount", nRecords + 2
        '***************************************
        '将结果保存到文件。
        Open sOutXML For Output As #1
        Print #1, oResults.xml
        Close #1
        '在 Excel 中打开 XML。
        Dim oExcel As Object
        Set oExcel = CreateObject("Excel.Application")
        oExcel.Workbooks.Open sOutXML
        oExcel.Visible = True
        oExcel.UserControl = True
        '***************************************
      End If
    

    注意: 如果需要,修改连接字符串 (Const sConn),使其包含示例 Access Northwind 示例数据库的正确安装路径。

  4. F5 键运行该程序。

  5. 单击 Form1 上的按钮。Northwind 示例数据库中的 Orders Detail 表的数据显示在创建的 Excel 工作簿模板中(请参阅图 7)。

    odc_xlxmlhowto07

    图 7. Order Detail 表中的带格式的数据

    该示例使用 Workbooks 集合的 Open 方法生成 XML 电子表格并自动化 Excel,来将 XML 打开为一个新的工作簿。另一种方法为,可以直接将 XML 插入到现有工作表的指定单元格中。为了进行说明,将星号之间包含的代码替换为以下部分:

            'Display the data in a workbook starting at cell B2.
        Dim oExcel As Object, oBook As Object
        Set oExcel = CreateObject("Excel.Application")
        Set oBook = oExcel.Workbooks.Add
        oBook.Worksheets(1).Range("B2").Resize(nRecords + 2, nFields + 1).Value(11) = _
            oResults.xml 'Note: xlRangeValueXMLSpreadsheet=11
        oExcel.Visible = True
        oExcel.UserControl = True
    

进行完更改之后,再次运行此程序。请注意,这次 Excel 将 XML 电子表格数据插入到新的工作簿中,从第一个工作表的单元格 B2 开始插入。Excel 将单元格数据和格式应用到该范围;但是,使用此方法时 Excel 并不继续专用于行、列、工作表和工作簿的设置。

使用 ASP 将 XML 保留的 ADO 记录集转换为 XML 电子表格

  1. 将以下代码粘贴到记事本中。将代码命名为 ExcelXML.asp,并将其保存在 Web 服务器的虚拟根文件夹中。

    注意: 默认的虚拟根文件夹为 C:\inetpub\wwwroot。

    列表 10. 使用 ASP 将 ADO 记录集转换为 XML 电子表格的代码

    <%@ Language="vbscript"%>
    <%
        Const sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\program files\microsoft
    office\office11\samples\Northwind.mdb"
    Const sXSL = "C:\ExcelXML\Orders.xsl"
    
    Response.Buffer = True
    '检索 Northwind 中 Orders Detail 表的 ADO 记录集。
    Dim rs, nRecords
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM [Order Details]", sConn, 3, 3
    
    '将此记录集保留为新的 DOMDocument,并存储记录计数。
    Dim oXML
    Set oXML = CreateObject("Microsoft.XMLDOM")
    rs.Save oXML, 1
    nRecords = rs.RecordCount
    rs.Close
    
    '将 XSL(使用 XSL 指令的工作簿模板)加载到 DOMDocument 中。
    Dim oXSL
    Set oXSL = CreateObject("Microsoft.XMLDOM")
    oXSL.Load sXSL
    
    '使用样式表转换 XML。
    Dim oResults
    Set oResults = CreateObject("Microsoft.XMLDOM")
    oXML.transformNodeToObject oXSL, oResults
    
    If oXSL.parseError.errorCode <> 0 Then
       Response.Write "Parse Error: " & oResults.parseError.reason
    Else
       '修改 XSL 中 <table> 节点的 ss:ExpandedRowCount 属性。
        Dim oTable
        Set oTable = oResults.selectSingleNode("Workbook/Worksheet/Table")
        oTable.setAttribute "ss:ExpandedRowCount", nRecords + 2
        '返回得到的 XML 电子表格,以便在 Excel 中进行显示。
        Response.ContentType = "application/vnd.ms-excel"
        Response.Charset = "ISO-8859-1"
        Response.Write oResults.XML
        Response.Flush
      End If
    %>
    

    注意: 如果需要,修改连接字符串 (Const sConn),使其包含示例 Access Northwind 示例数据库的正确安装路径。

  2. 启动 Internet Explorer 并浏览到 http://Server_name/ExcelXML.asp,其中 Server_name 是 Web 服务器的名称。Northwind 示例数据库中的 Orders Detail 表的数据显示在创建的 Excel 工作簿模板中。

结论

在本文中,学习了用于使用 XML 带格式文件和 XML 样式表处理 Excel 工作簿的各种方法。另外,阅读了 XML 文件 XML 样式表的概述。而且,本文说明了如何使用 ASP 和 Visual Basic 创建带格式的 Excel 工作簿。最后,本文说明了使用 ASP 创建可用于流式传输 Excel 工作簿的 MIME 消息的步骤。结合使用 Visual Basic、ASP 和 XML 可以获取许多创建 Excel 解决方案的方法。