如何使用 XSL 转换为服务器端使用的 Excel XML 电子表格

文章翻译 文章翻译
文章编号: 278976 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

Excel 2002 引入了新的 XML 功能,使开发人员能够以 XML 电子表格 (XMLSS) 格式的工作表中提取带格式的数据。一个 Range 对象,对象的 Value 属性可以在 XMLSS 中返回单元格格式和内容。XMLSS 是标准格式 XML 的可用于在运行时的操作,Microsoft XML 分析程序被加载。此功能的潜在用途之一是将张贴到服务器应用程序进行处理的 XML 数据。本文阐释了一个此类示例,在其中一个 Excel 工作簿用作接口处理从工作簿中的范围中提取的 XML 数据的活动服务器页面 (ASP) 脚本。

本文将引导您完成创建 Excel 工作簿、 的 ASP 脚本和全部订单处理系统协同工作的样式表。整个在的步骤中指定每个组件的说明和它成为了整个解决方案的组成部分。本文中介绍的示例也是可用的下载 ; 下载说明的请参阅本文结尾处的"下载"部分。

更多信息

在此的示例中的若干个不同组件协同工作以用作一个订单处理:
  • ASP 脚本。服务器端组件是所需的新的订单的客户端请求的 ASP 脚本。脚本需要为特定的 XML 格式的请求。该脚本将信息从 XML,它接收,并将新的订单添加到罗斯文示例数据库中,通过使用 ActiveX 数据对象 (ADO)。
  • Excel 工作簿。客户端组件是 Excel 工作簿包含一个工作表中的订单输入和与 ASP 脚本来处理用户的新的订单进行交互的宏。
  • XSL 样式表。样式表将转换为 Excel XMLSS,为 ASP 脚本需要的自定义 XML 格式。Excel 宏加载样式表,并将转换为自定义 XML 之前以在 Web 服务器上过帐到 ASP 脚本数据 XMLSS。

步骤 1: 创建 ASP 顺序处理脚本

创建一个名为 OrderProc Web 服务器 (默认的根文件夹是 C:\Inetpub\Wwwroot) 的虚拟根文件夹中的新文件夹。OrderProc 文件夹中创建一个新的文件,使用以下模板命名 OrderEntry.asp。该脚本使用示例罗斯文 Access 数据库,您可能需要修改连接字符串 (sConn) 以匹配您的 Office 安装中 Northwind.mdb 路径。
<%@ Language="vbscript" CodePage="65001"%>

<%
    Response.Buffer = True
    Response.ContentType = "text/xml"
  
    Dim oDataXML                    'Custom Data XML passed in by caller.
    Dim oConn                       'ADO Connection to Northwind database.
    Dim oOrdersRS, oDetailsRS       'ADO Recordsets for the Orders table and Order Details Table.
    Dim oItems                      'Collection of nodes meeting the match. "Order/Items/Item"
    Dim oItem                       'Single node in oItems.
    Dim sCustID                     'Customer ID for the new order.
    Dim sOrderID                    'Order ID of the newly created record. in Orders table
    Dim sStatus                     'Status of order processing.
    Dim bContinue                   'Flag that indicates whether or not to continue processing the order.

    Const sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\program files\microsoft office\office10\samples\northwind.mdb"
    On Error Resume Next

    'Load the XML passed into the request.
    Set oDataXML = Server.CreateObject("Microsoft.XMLDOM")
    oDataXML.Load Request
    bContinue = True

    'Obtain the Customer ID. If no customer id is provided, report an error.
    sCustID = oDataXML.selectSingleNode("Order/CustomerID").Text
    If sCustID="" Then
       sStatus = "There is no customer specified for the order"
       bContinue = False
    End If

    'Obtain collection of "items" for this order. If the item count = 0, report an error.
    If bContinue Then
       Set oItems = oDataXML.SelectNodes("Order/Items/Item")
       if oItems.length = 0 Then
          sStatus = "There are no items to process for this order"
          bContinue = False
       End If
    End If

    'Open a connection to the Northwind database.
    If bContinue Then
       Set oConn = CreateObject("ADODB.Connection")
       oConn.Open sConn
       if err.Number <> 0 Then
          sStatus = err.Description
          bContinue = False
       end if

    End If

    'Open the Orders and Order Details tables and add the new records.
    If bContinue Then

       Set oOrdersRS = CreateObject("ADODB.Recordset")
       oOrdersRS.Open "SELECT * FROM Orders", oConn, 2, 3
       Set oDetailsRS = CreateObject("ADODB.Recordset")
       oDetailsRS.Open "SELECT * FROM [Order Details]", oConn, 2, 3

       'Add a new entry in the Orders table.
       oOrdersRS.AddNew
       oOrdersRS.Fields("CustomerID").Value = sCustID
       oOrdersRS.Fields("OrderDate").Value = CDate(Now)
       oOrdersRS.Update
       sOrderID = oOrdersRS.Fields("OrderID").Value
        
       'And a new record for each item in the order XML to the Order Details table.
       If err.number = 0 Then
          For Each oItem In oItems
              oDetailsRS.AddNew
              oDetailsRS.Fields("OrderID").Value = sOrderID
              oDetailsRS.Fields("ProductID").Value = oItem.childnodes(0).Text
              oDetailsRS.Fields("Quantity").Value = CLng(oItem.childnodes(1).Text)
              oDetailsRS.Fields("UnitPrice").Value = CLng(oItem.childnodes(2).Text)
              oDetailsRS.Fields("Discount").Value = 0
              oDetailsRS.Update
          Next
       End If

       if err.Number <> 0 Then
          sStatus = err.Description
       else
          sStatus = "Success"
       end if

       'Close the recordsets and connection.
       oDetailsRS.Close
       oOrdersRS.Close
       oConn.Close

    End If
  
    'Return the resulting XML (the Order status).
    Dim sResult
    sResult = "<?xml version=""1.0""?>"
    sResult = sResult & "<OrderProcessed>" 
    sResult = sResult & "<Status>" & sStatus & "</Status>"
    sResult = sResult & "<OrderID>" & sOrderID & "</OrderID>"
    sResult = sResult & "</OrderProcessed>"
    Response.Write sResult
    Response.End
 
%> 
				
成功处理一个订单的请求,此 ASP 脚本期望 XML 数据结构如下所示:

<?xml version="1.0"?>
<Order>
    <CustomerID>BOTTM</CustomerID>
    <Items>
        <Item>
            <ProductID>4</ProductID>
            <Quantity>11</Quantity>
            <Price>20.25</Price>
        </Item>
        <Item>
            <ProductID>18</ProductID>
            <Quantity>2</Quantity>
            <Price>63.7</Price>
        </Item>
    </Items>
</Order>
					
此 XML 指定的"BOTTM"ID 与客户的订单。顺序包含两个项目: 产品的 4 的 id 的 11 单位和产品的与 18 的 ID 的 2 个单位。

ASP 脚本执行一些错误处理,以确保客户端具有提供它具有有效的订单信息。客户端必须提供客户 ID 和至少一项 ; 如果不满足这些条件,时 ASP 脚本不会处理顺序,并返回一个错误。

ASP 脚本来做的顺序请求的客户端返回 XML 数据。此 XML 指示成功或失败的订单处理和还提供有关成功的订单号:

<?xml version="1.0"?>
<OrderProcessed>
    <Status>Success</Status>
    <OrderID>11078</OrderID>
</OrderProcessed>
					

步骤 2: 创建订单输入工作簿的界面

  1. 在 Excel,启动一个新的工作簿。
  2. 标签中输入单元格 A1、 A3、 B3,和 C3 如下所示:
    A1:   Customer ID    B1:                C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    					
  3. 选择单元格 A1:B1。在 插入 菜单上指向 名称,然后单击 创建创建名称 对话框中选择 左侧列,然后单击 确定。这将创建已定义的名称 Customer_ID 的单元格 B1。
  4. 选择单元格 A3:C8。在 插入 菜单上指向 名称,然后单击 创建创建名称 对话框中选择 顶行,然后单击 确定。这将分别创建单元格 A4:A8、 B4:B8,和 C4:C8 已定义的名称 Product_ID数量价格
  5. 按 ALT + F11 可启动 Visual Basic 编辑器。
  6. 在 Visual Basic 编辑器中,在 插入 菜单上单击 模块。将添加到代码模块中下面的宏:
    Sub ProcessOrder()
    
        Const sFolder = "http://YourWebServer/OrdrProc/"
    
        'Load a new DOMDocument based on the XMLSS of the range A1:C8.
        Dim oRangeXML
        Set oRangeXML = CreateObject("Microsoft.XMLDOM")
        oRangeXML.LoadXML Range("A1:C8").Value(xlRangeValueXMLSpreadsheet)
            
        'Transform the XMLSS to custom XML that the ASP can
        'interpret as a new "order".
        Dim oXSL, oOrderXML
        Set oXSL = CreateObject("Microsoft.XMLDOM")
        oXSL.Load ThisWorkbook.Path & "\OrderEntry.xsl"
        Set oOrderXML = CreateObject("Microsoft.XMLDOM")
        oRangeXML.transformNodeToObject oXSL, oOrderXML
        
        'Submit the XMLSS to the ASP page for processing.
        Set oXMLHTTP = CreateObject("Microsoft.XMLHTTP")
        oXMLHTTP.Open "Post", sFolder  & "/OrderEntry.asp", False
        oXMLHTTP.setRequestHeader "Content-Type", "text/xml; charset=""UTF-8"""
        oXMLHTTP.send oOrderXML
        
        'Retrieve the results of the processing by the ASP page.
        Dim oResult
        Set oResult = CreateObject("Microsoft.XMLDOM")
        oResult.Load oXMLHTTP.responseXML
    
        'Check the returned XML -- if the Status is "Success", fill in the
        'Order # and display a message. If the Status is not "Success",
        'report the error.
        Dim sStatus As String
        sStatus = oResult.selectsinglenode("OrderProcessed/Status").Text
        If sStatus = "Success" Then
            MsgBox "Thank you. Your order number is " & _
                oResult.selectsinglenode("OrderProcessed/OrderID").Text
        Else
            MsgBox sStatus
        End If
    
    End Sub
    					
    : 更改 YourWebServer sFolder 常量为您的 Web 服务器的名称。

  7. 关闭 Visual Basic 编辑器并返回到 Excel 中。
  8. 您以前创建作为 Invoice1.xls OrdrProc 文件夹中保存工作簿。
实质上是单元格 A1:C8 订单表单。该宏检索在订单窗体 XMLSS,并将其加载到一个新的 DOMDocument 对象。然后,它将可扩展样式表语言 (XSL) 样式表加载到另一个 DOMDocument,并将在 XMLSS 转换为 ASP 可以解释为新的订单的 XML 结构。该宏使用 XMLHTTP 对象在 Web 服务器上张贴到 ASP 脚本的 XML 顺序。ASP 脚本处理顺序,然后返回到订单状态信息的宏的更多的 XML。

: 为一个设计选项将转换为自定义顺序 XML XMLSS 任务提供给客户端的宏代码。此外可以张贴到 ASP 脚本 XMLSS 并让您执行转换的 ASP。

步骤 3: 创建该样式表

OrdrProc 文件夹中创建一个名为 OrderEntry.xsl 的新文件,并将以下代码粘贴到 XSL:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

  <xsl:template match="/">
    <xsl:pi name="xml">version="1.0"</xsl:pi>

    <Order>
      <CustomerID><xsl:value-of select="Workbook/Worksheet/Table/Row/Cell[NamedCell[@ss:Name='Customer_ID'] $and$ Data[@ss:Type!='Error']]"/></CustomerID>
      <Items>
        <xsl:for-each select="Workbook/Worksheet/Table/Row[Cell[NamedCell[@ss:Name='Product_ID'] $and$ Data[@ss:Type!='Error']]]">
          <Item>
            <xsl:apply-templates/>
          </Item>
        </xsl:for-each>
      </Items>
    </Order>

  </xsl:template>

  <xsl:template match="Cell[NamedCell[@ss:Name='Product_ID']]">
    <ProductID><xsl:value-of select="Data"/></ProductID>
  </xsl:template>

  <xsl:template match="Cell[NamedCell[@ss:Name='Quantity']]">
    <Quantity><xsl:value-of select="Data"/></Quantity>
  </xsl:template>

  <xsl:template match="Cell[NamedCell[@ss:Name='Price']]">
    <Price><xsl:value-of select="Data"/></Price>
  </xsl:template>

</xsl:stylesheet>
				
的 XSL 转换在 XMLSS 到自定义顺序 XML (第 1 步中所示),如下所示:
  • XSL 查找客户 ID 的遍历节点层次结构,直到遇到包含该 <namedcell><cell>节点和 <data>子节点。它检查 <namedcell>具有 ss:Name 属性等于 Customer_ID,并将该 <data>具有一个不等于错误的 ss:Type 属性。
  • 若要找到该订单的项目,XSL 查找所有 <row>与 <cell>节点的节点包含带有 ss:Name 属性的 Product_ID <namedcell>子节点和 <data>子节点带有 ss:Type 属性不是错误。
  • 对于每个 <row>XSL 确定是一项在的顺序对于 XSL 使用模板来匹配具有 ss:Name 属性的 Product_ID、 数量和价格的 <namedcell>节点。

第 4 步: 运行到处理新的订单示例代码

  1. 返回到 Excel 中 Invoice1.xls。
  2. 若要模拟订单录入,Sheet1 更新与客户和产品信息,如下所示:
    A1:   Customer ID    B1:   BOTTM        C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    A4:   4              B4:   11           C4:   20.25
    A5:   18             B5:   2            C5:   63.70
    					
    : 对于此的示例中,您必须输入有效的客户和产品标识为 ASP 脚本已成功处理顺序。

  3. 工具 菜单上指向 ,然后单击 。在列表中,选择 ProcessOrder 宏,单击 运行
  4. 如果 ASP 脚本已成功处理顺序,您将收到一条消息,新的订单编号。启动 Access,打开罗斯文示例数据库。您应该看到订单表中的一个新条目与从 ASP 返回订单 ID。您还看到订单明细表中的两个新项的相同的订单 id。退出 Access 并返回到 Excel 中 Invoice1.xls。
  5. 清除单元格 B1 中的客户 ID,然后再次运行该宏。这一次服务器无法处理订单,它将返回一个错误,指示已提供了没有客户 ID。

下载

ExcelXML.exe 包含这篇文章,以及 Invoice1.xls 的增强的版本中所述的示例。Invoice2.xls 使用同一 ASP 脚本和 XSL 样式表作为 Invoice1.xls。但是,Invoice2.xls 演示如工作表保护、 数据验证和使用可以提供一个对用户更加友好的订单窗体的 VLOOKUP 公式的其他 Excel 功能。

以下文件是可从 Microsoft 下载中心下载:
Excelxml.exe
发布日期: 2001 2001年 4 月 3日,

有关如何下载 Microsoft 支持文件的其他信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591如何从联机服务获得 Microsoft 支持文件
Microsoft 扫描此文件的病毒。Microsoft 使用该文件已过帐的日期上获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器,这有助于防止未经授权的情况下对其进行更改文件上。

参考

要构建服务器端解决方案中使用 XML 和 ASP 的详细信息,请参阅下面的 Microsoft 开发人员网络 (MSDN) 的网站:
XML 简介
http://www.microsoft.com/learning/en/us/syllabi/2500AFinal.mspx

XML 教程
http://msdn.microsoft.com/en-us/library/ms950712.aspx

XSL 开发人员指南 》 中的
http://msdn.microsoft.com/en-us/library/ms862738.aspx

客户端和服务器之间发送 XML
http://msdn.microsoft.com/en-us/library/ms763733.aspx

有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
288215信息: Excel 2002 和 XML
285891如何使用 Visual Basic 或 ASP 功能来创建用于 Excel 2002 为 XML 数据表
288130如何使用 ASP 为客户端显示生成电子表格 XML
(c) Microsoft 公司 2001,保留的所有权限。Lori B.旋转器,Microsoft 公司的贡献。

属性

文章编号: 278976 - 最后修改: 2007年1月29日 - 修订: 4.8
这篇文章中的信息适用于:
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Excel 2002 标准版
关键字:?
kbmt kbdownload kbdownload kbfile kbhowto KB278976 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 278976
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com