Como utilizar XSL para transformação de folha de cálculo do Excel XML para utilização do lado do servidor

Traduções de Artigos Traduções de Artigos
Artigo: 278976 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Excel 2002 introduz novas funcionalidades XML que permite aos programadores extrair dados formatados de folhas de cálculo num formato XMLSS (XML Spreadsheet). A propriedade de valor de um objecto Range pode devolver a formatação de células e o conteúdo em XMLSS. XMLSS está correctamente formado XML que pode ser carregado pelo Microsoft XML Parser para manipulação em tempo de execução. Um potencial utilização desta funcionalidade consiste em registar dados XML para uma aplicação de servidor para processamento. Este artigo ilustra esse exemplo, em que um livro do Excel é utilizado como uma interface para um script de ASP (Active Server Pages) que processa dados XML que são extraídos de um intervalo de um livro.

Este artigo orienta-a criação de um livro do Excel, um script ASP e uma folha de estilos todas funcionam em conjunto como uma ordem de processamento de sistema. Durante os passos explicações de cada componente e como contribui para a solução completa são indicados. O exemplo descrito neste artigo também está disponível para transferência; obter instruções de transferência, consulte a secção de "Transferência" no fim deste artigo.

Mais Informação

Neste exemplo, várias diferentes componentes funcionam em conjunto para funcionar como um processador de encomenda:
  • scripts de ASP . O componente do lado do servidor é um script ASP que tem pedidos de cliente para novas encomendas. O script espera pedidos estar num formato XML específico. O script utiliza informações de XML que recebe e adiciona uma nova ordem de base de dados de exemplo Adamastor utilizando o ActiveX Data Objects (ADO).
  • livro do Excel . O componente do lado do cliente é um livro do Excel que contém uma folha de cálculo para ordem de entrada e uma macro que interage com o script ASP para processar nova ordem o utilizador.
  • Stylesheet XSL . Uma folha de estilos transforma o XMLSS de Excel para o formato XML personalizado que requer o script de ASP. A macro do Excel carrega a folha de estilos e transformações XMLSS a XML personalizado antes para registar os dados para o script de ASP no servidor Web.

Passo 1: Criar o script de processamento de ordem ASP

Crie uma nova pasta denominada OrderProc na pasta raiz virtual do servidor Web (a pasta de raiz predefinido é C:\Inetpub\Wwwroot). Na pasta OrderProc, crie um novo ficheiro chamado OrderEntry.asp com o script abaixo. O script utiliza o acesso da base de dados de exemplo; poderá precisar de modifique o caminho para a base de dados Adamastor.mdb na cadeia de ligação (sConn) para corresponder a instalação do 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 processar com êxito um pedido de encomenda, este script ASP espera dados XML estruturados da seguinte forma:

<?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 uma encomenda para o cliente com o ID do "BOTTM". A ordem contém dois itens: 11 de unidades do produto com o ID de 4 e 2 unidades do produto com o ID de 18.

O script de ASP não algum processamento de erros para garantir que os clientes forneceu-lo com informações sobre encomendas válido. Os clientes tem de fornecer um código do cliente e pelo menos um item; se estes critérios não forem cumpridos, o script ASP não processa a ordem e devolve um erro.

O script de ASP devolve dados XML para clientes que tenham efectuado um pedido de encomenda. Este XML indica o êxito ou falha de processamento de encomendas e também fornece o número da encomenda no êxito:

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

Passo 2: Criar a interface de livro para introdução de encomendas

  1. No Excel, inicie um novo livro.
  2. Introduza rótulos nas células A1, A3, B3 e C3 da seguinte forma:
    A1:   Customer ID    B1:                C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    					
  3. Seleccione células A1:B1. No menu Inserir , aponte para Nome e, em seguida, clique em criar . Na caixa de diálogo Criar nomes , seleccione a Coluna da esquerda e clique em OK . Este procedimento cria o nome definido Customer_ID célula B1.
  4. Seleccione células A3:C8. No menu Inserir , aponte para Nome e, em seguida, clique em criar . Na caixa de diálogo Criar nomes , seleccione a Linha de cima e clique em OK . Isto cria os nomes definidos Product_ID , quantidade e Preço para células A4:A8 B4:B8 e C4:C8 respectivamente.
  5. Prima ALT+F11 para iniciar o Editor do Visual Basic.
  6. No Editor do Visual Basic, no menu Inserir , clique em módulo . Adicione a seguinte macro ao 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 : alterar YourWebServer na constante de sFolder para o nome do seu servidor Web.

  7. Feche o Editor do Visual Basic e regresse ao Excel.
  8. Guarde o livro na pasta que criou anteriormente como Invoice1.xls OrdrProc.
O "formulário de encomenda" é essencialmente A1:C8 de células. A macro obtém o XMLSS para o formulário de encomenda e carrega-o para um novo objecto de ' DOMDocument ' . Em seguida, carrega a folha de estilos XSL (Extensible Stylesheet Language) para outro ' DOMDocument ' e transforma o XMLSS uma estrutura XML que o ASP pode interpretar como uma nova encomenda. A macro utiliza o objecto XMLHTTP regista a encomenda XML para o script ASP no servidor Web. O script de ASP processa a ordem e devolve mais XML para a macro para informações de estado de ordem.

Nota : como uma opção de estrutura, a tarefa de transformar o XMLSS para XML ordem personalizada é atribuída o código de macro do lado do cliente. Pode também registar XMLSS ao script de ASP e permitir que o ASP efectuar a transformação por si.

Passo 3: Criar a Stylesheet

Na pasta OrdrProc, crie um novo ficheiro chamado OrderEntry.xsl e cole o seguinte código 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>
				
O XSL transforma o XMLSS a personalizada ordem XML (ilustrado no passo 1) da seguinte forma:
  • O XSL localiza o ID de cliente por atravessar a hierarquia de nó até encontrar um nó <cell> que contém o <namedcell> e nós subordinados de <data>. Verifica que <namedcell> tem um atributo de ss:Name igual a 'Customer_ID' e que <data> tem um atributo ss:Type que não é igual a 'Erro'.
  • Para localizar itens para a ordem, o XSL localiza todos os nós com um nó <cell> <row> que contêm um nó subordinado de <namedcell> com um atributo ss:Name de 'Product_ID' e um nó subordinado de <data> com um atributo ss:Type que não é 'Erro'.
  • Para cada <row> o XSL determina é um item para a ordem, o XSL utiliza modelos para fazer corresponder <namedcell> nós que têm um atributo ss:Name de 'Product_ID', 'Quantidade' e 'Preço'.

Passo 4: Executar o código de exemplo para processar uma nova encomenda

  1. Voltar a Invoice1.xls no Excel.
  2. Para simular o movimento de ordem, actualizar Folha1 com informações de cliente e produto conforme é ilustrado abaixo:
    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 exemplo, tem de introduzir cliente e produto IDs válidos para o script ASP para processar com êxito a ordem.

  3. No menu Ferramentas , aponte para macro e clique em macros . Seleccione a macro ProcessOrder na lista e clique em Executar .
  4. Se o script ASP processa com êxito a ordem, receberá uma mensagem com o novo número de encomenda. Inicie o Microsoft Access e abra a base de dados de exemplo Adamastor. Deverá ver uma nova entrada na tabela Encomendas com o código da encomenda devolvido a partir de ASP. Consulte também duas novas entradas na tabela Detalhes da encomenda para o mesmo ID da encomenda. Saia do Access e regressar à Invoice1.xls no Excel.
  5. Desmarque o ID de cliente na célula B1 e execute a macro novamente. Desta vez, o servidor não é possível processar a encomenda e devolve um erro indicando que não foi fornecido nenhum ID de cliente.

Transferir

ExcelXML.exe contém exemplo descrito neste artigo, bem como uma versão melhorada da Invoice1.xls. Invoice2.xls utiliza o mesmo script ASP e a folha de estilos XSL como Invoice1.xls. No entanto, Invoice2.xls demonstra funcionalidades adicionais do Excel, tais como protecção de folha de cálculo, validação de dados e fórmulas PROCV, que pode utilizar para fornecer um formulário de encomenda mais fácil de utilizar.

O ficheiro seguinte está disponível para transferência a partir do Centro de transferências da Microsoft:
Excelxml.exe
Data de edição: 3 de Abril de 2001

Para obter informações adicionais sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591Como obter ficheiros de suporte da Microsoft a partir de serviços on-line
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada que o ajudam a impedir alterações não autorizadas ao ficheiro.

Referências

Para informações adicional sobre como utilizar XML e o ASP para criar soluções do lado do servidor, consulte os seguintes Web sites da Microsoft Developer Network (MSDN):
Introdução ao XML
http://www.microsoft.com/learning/en/us/syllabi/2500AFinal.mspx

Iniciação do XML
http://msdn.microsoft.com/en-us/library/ms950712.aspx

Guia de programação XSL
http://msdn.microsoft.com/en-us/library/ms862738.aspx

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

Para obter informações adicionais, clique nos números de artigo existentes abaixo para visualizar os artigos na Microsoft Knowledge Base:
288215INFO: Excel 2002 e XML
285891Como utilizar o Visual Basic ou ASP para criar uma folha de cálculo XML para o Excel 2002
288130Como utilizar o ASP para criar folhas de cálculo XML para visualização do lado do cliente
(c) Microsoft Corporation 2001, todos os direitos reservados. Contribuições de Lori B. Turner, Microsoft Corporation.

Propriedades

Artigo: 278976 - Última revisão: 29 de janeiro de 2007 - Revisão: 4.8
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Excel 2002 Standard Edition
Palavras-chave: 
kbmt kbdownload kbdownload kbfile kbhowto KB278976 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 278976

Submeter comentários

 

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