Cómo utilizar XSL para transformar la hoja de cálculo XML de Excel para su uso en el servidor

Seleccione idioma Seleccione idioma
Id. de artículo: 278976 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Excel 2002 incluye nueva funcionalidad XML que permite a los desarrolladores extraer datos con formato de hojas de cálculo en un formato de hoja de cálculo XML (XMLSS). La propiedad Value de un objeto Range puede devolver el formato de celdas y contenido en XMLSS. Está bien formado XMLSS XML que se puede cargar el analizador para la manipulación en tiempo de ejecución. Uno de los posible usos de esta característica es registrar datos XML a una aplicación de servidor para su procesamiento. Este artículo muestra un ejemplo, en el que un libro de Excel se utiliza como una interfaz para una secuencia de comandos páginas Active Server (ASP) que procesa datos XML que se extraen un intervalo en un libro.

En este artículo le guiará en la creación de un libro de Excel, una secuencia de comandos ASP y una hoja de estilos que todos funcionan conjuntamente como un sistema de procesamiento de pedido. Durante los pasos, se concede explicaciones de cada componente y cómo contribuye a toda la solución. El ejemplo descrito en este artículo también está disponible para descarga; para instrucciones de descarga, vea la sección "Descargar" al final de este artículo.

Más información

En este ejemplo, varios componentes diferentes funcionan conjuntamente para funcionar como un procesador de pedidos:
  • secuencia de comandos ASP . El componente de servidor es un ASP que toma las solicitudes de nuevos pedidos de clientes. La secuencia de comandos espera las solicitudes a estar en un formato XML específico. La secuencia de comandos toma la información desde el código XML que recibe y agrega un nuevo pedido a la base de datos Neptuno mediante ActiveX Data Objects (ADO).
  • libro de Excel . El componente de cliente es un libro de Excel que contiene una hoja de cálculo para entrada de orden y una macro que interactúa con la secuencia de comandos ASP para procesar el pedido del usuario nuevo.
  • hoja de estilos XSL . Una hoja de estilos transforma la XMLSS de Excel en el formato XML personalizado que requiere la secuencia de comandos ASP. La macro de Excel, carga la hoja de estilos y transforma XMLSS al XML personalizado a antes de exponer los datos a la secuencia de comandos ASP en el servidor Web.

Paso 1: Crear el script de procesamiento de pedidos ASP

Cree una nueva carpeta denominada OrderProc en la carpeta raíz virtual del servidor Web (la carpeta de raíz predeterminada es C:\inetpub\wwwroot). En la carpeta OrderProc, cree un nuevo archivo denominado OrderEntry.asp con la secuencia de comandos siguiente. La secuencia de comandos utiliza la base de datos de Access Neptuno de ejemplo; es posible que necesitará modificar la ruta de acceso a Neptuno.mdb en la cadena de conexión (sConn) para que coincida con la instalación de Office.
<%@ 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
 
%> 
				
para procesar correctamente una solicitud de pedido, esta secuencia de comandos ASP espera datos XML estructurados como sigue:

<?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>
					
Este XML designa un pedido para el cliente con el identificador de "BOTTM". El pedido contiene dos elementos: 11 unidades del producto con el identificador de 4 y 2 unidades del producto con el identificador de 18.

La secuencia de comandos ASP no algunos tratamiento de errores para asegurarse de que los clientes han proporcionado, con información de pedido válido. Los clientes deben proporcionar un ID de cliente y al menos un elemento; si no se cumplen estos criterios, la secuencia de comandos ASP no procesa el pedido y devuelve un error.

La secuencia de comandos ASP devuelve datos XML a los clientes que han realizado una solicitud de pedido. Este XML indica el éxito o error de procesamiento de pedidos y también proporciona el número de orden de éxito:

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

Paso 2: Crear la interfaz de libro para entrada de orden

  1. En Excel, inicie un nuevo libro.
  2. Introducir rótulos en las celdas A1, A3, B3 y C3 como sigue:
    A1:   Customer ID    B1:                C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    					
  3. Seleccione las celdas a1: B1. En el menú Insertar , elija nombre y, a continuación, haga clic en crear . En el cuadro de diálogo Crear nombres , seleccione la Columna izquierda y haga clic en Aceptar . Esto crea el nombre definido Customer_ID para la celda B1.
  4. Seleccione las celdas A3:C8. En el menú Insertar , elija nombre y, a continuación, haga clic en crear . En el cuadro de diálogo Crear nombres , seleccione la Fila superior y haga clic en Aceptar . Esto crea los nombres definidos Product_ID , cantidad y precio para celdas A4:A8 B4:B8 y C4:C8 respectivamente.
  5. Presione ALT+F11 para iniciar el Editor de Visual Basic.
  6. En el Editor de Visual Basic, en el menú Insertar , haga clic en módulo . Agregue la macro siguiente al módulo de código:
    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
    					
    Nota : cambiar SuServidorWeb en la constante sFolder en el nombre de su servidor Web.

  7. Cierre el Editor de Visual Basic y vuelva a Excel.
  8. Guarde el libro en la carpeta OrdrProc que creó anteriormente como Invoice1.xls.
El "formulario de pedido" es esencialmente A1:C8 de celdas. La macro recupera XMLSS para el formulario de pedido y lo carga en un nuevo objeto DOMDocument . A continuación, carga la hoja de estilos XSL (Extensible Stylesheet Language) en otro DOMDocument y transforma el XMLSS en una estructura XML que el ASP puede interpretar como un nuevo pedido. La macro utiliza el objeto XMLHTTP para registrar el pedido XML a la secuencia de comandos ASP en el servidor Web. La secuencia de comandos ASP procesa el pedido y después devuelve XML más a la macro para información de estado de pedido.

Nota : como una opción de diseño, la tarea de transformar XMLSS XML orden personalizado se asigna al código de macro de lado del cliente. También puede registrar XMLSS a la secuencia de comandos ASP y permiten realizar la transformación de ASP.

Paso 3: Crear la hoja de estilos

En la carpeta OrdrProc, cree un nuevo archivo denominado OrderEntry.xsl y pegue el código XSL siguiente:
<?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>
				
el XSL transforma XMLSS al orden XML personalizado (que se muestra en el paso 1) como sigue:
  • El XSL localiza el ID de cliente recorriendo la jerarquía de nodos hasta que encuentra un nodo de <cell> que contiene el <namedcell> y nodos secundarios de <data>. Comprueba que <namedcell> tiene un atributo de ss:Name igual a 'Customer_ID' y que <data> tiene un atributo ss:Type que no es igual a 'Error'.
  • Para buscar elementos para el pedido, el XSL busca todos los nodos de <row> con un nodo <cell> que contienen un nodo secundario de <namedcell> con un atributo ss:Name de 'Product_ID' y un nodo secundario de <data> con un atributo ss:Type que no es 'Error'.
  • Para cada <row> que determina el XSL es un elemento para el pedido, el XSL utiliza plantillas para coincidir con los nodos de <namedcell> que tienen un atributo ss:Name de 'Product_ID', 'Cantidad' y 'Price'.

Paso 4: Ejecutar el código de ejemplo para procesar un pedido nuevo

  1. Volver a Invoice1.xls en Excel.
  2. Para simular la entrada de pedidos, actualizar Sheet1 con información de cliente y producto como se muestra a continuación:
    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
    					
    Nota : para este ejemplo, debe escribir el cliente y producto identificadores válidos para la secuencia de comandos ASP para procesar correctamente el orden.

  3. En el menú Herramientas , elija macro y haga clic en macros . Seleccione la macro ProcessOrder en la lista y haga clic en Ejecutar .
  4. Si la secuencia de comandos ASP procesa correctamente el orden, recibirá un mensaje con el nuevo número de pedido. Inicie Microsoft Access y abra la base de datos de ejemplo Neptuno. Debería ver una nueva entrada en la tabla Orders con el ID pedido devuelto desde el ASP. También verá dos entradas nuevas en la tabla Detalles de pedidos para el mismo ID de pedido. Salir de Access y vuelva a Invoice1.xls en Excel.
  5. Desactive el ID de cliente en la celda B1 y ejecute de nuevo la macro. Esta vez, el servidor no puede procesar el pedido y devuelve un error que indica que no se ha proporcionado ningún ID de cliente.

Descargar

ExcelXML.exe contiene el ejemplo descrito en este artículo, así como una versión mejorada de Invoice1.xls. Invoice2.xls utiliza la misma secuencia de comandos ASP y la hoja de estilos XSL como Invoice1.xls. Sin embargo, Invoice2.xls muestra características de Excel adicionales, como la protección de la hoja de cálculo, validación de datos y fórmulas de BUSCARV, que puede utilizar para proporcionar un formulario de pedido más fácil de usar.

El archivo siguiente está disponible para descargarlo del Centro de descarga de Microsoft:
Excelxml.exe
Fecha de lanzamiento: 3 de abril de 2001

Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a impedir la realización de cambios no autorizados.

Referencias

Para información adicional sobre el uso XML y ASP para generar soluciones de servidor, vea los siguientes sitios Web de Microsoft Developer Network (MSDN):
Introducción a XML
http://www.microsoft.com/learning/en/us/syllabi/2500AFinal.mspx

Tutorial de XML
http://msdn.microsoft.com/en-us/library/ms950712.aspx

Manual del programador XSL
http://msdn.microsoft.com/en-us/library/ms862738.aspx

Enviar XML entre el cliente y servidor
http://msdn.microsoft.com/en-us/library/ms763733.aspx

Para obtener información adicional, haga clic en los números de artículo correspondientes para verlos en Microsoft Knowledge Base:
288215INFO: Excel 2002 y XML
285891Cómo utilizar Visual Basic o ASP para crear una hoja de cálculo XML para Excel 2002
288130Cómo utilizar ASP para crear la hoja de cálculo XML para mostrar en el cliente
(c) Microsoft Corporation 2001, reservados todos los derechos. Contribuciones por Lori B. Turner, Microsoft Corporation.

Propiedades

Id. de artículo: 278976 - Última revisión: lunes, 29 de enero de 2007 - Versión: 4.8
La información de este artículo se refiere a:
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Excel 2002 Standard Edition
Palabras clave: 
kbmt kbdownload kbdownload kbfile kbhowto KB278976 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 278976

Enviar comentarios

 

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