Como usar XSL para transformar a planilha XML do Excel para uso do lado do servidor

Traduções deste artigo Traduções deste artigo
ID do artigo: 278976 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Excel 2002 apresenta a nova funcionalidade do XML que permite aos desenvolvedores extrair dados formatados de planilhas em um formato de planilha XML (XMLSS). A propriedade Value de um objeto Range pode retornar conteúdo e formatação de célula em XMLSS. XMLSS está bem formado XML que pode ser carregado pelo Microsoft XML Parser para manipulação em tempo de execução. Um uso potencial esse recurso é para postar dados XML em um aplicativo de servidor para processamento. Este artigo ilustra um exemplo, no qual uma pasta de trabalho do Excel é usada como uma interface para um script ASP (Active Server Pages) que processa dados XML que são extraídos de um intervalo em uma pasta de trabalho.

Este artigo o orienta a criação de uma pasta de trabalho do Excel, um script ASP e uma folha de estilos todos trabalham juntos como um sistema de processamento do pedido. Durante as etapas, explicações de cada componente e como ele contribui para a solução inteira são fornecidos. O exemplo descrito neste artigo também está disponível para download; para instruções de download, consulte a seção "Download" no final deste artigo.

Mais Informações

Neste exemplo, vários componentes diferentes trabalham juntos para funcionar como um processador de ordem:
  • script ASP . O componente do lado do servidor é um script ASP que aceita solicitações de cliente para novas ordens. O script espera solicitações para estar em um formato XML específico. O script usa as informações do XML que ele recebe e adiciona uma nova ordem para o banco de dados de exemplo Northwind usando ActiveX Data Objects (ADO).
  • pasta de trabalho do Excel . O componente do lado do cliente é uma pasta de trabalho Excel que contém uma planilha para entrada de ordem e uma macro que interage com o script ASP para processar o novo pedido do usuário.
  • folha de estilos XSL . Uma folha de estilos transforma o XMLSS do Excel para o formato XML personalizado que requer que o script ASP. A macro do Excel carrega a folha de estilos e transforma o XMLSS para o XML personalizado antes para lançamento os dados para o script ASP no servidor Web.

Etapa 1: Criar o script de processamento do pedido ASP

Crie uma nova pasta chamada OrderProc na pasta raiz virtual do seu servidor Web (pasta raiz padrão é C:\inetpub\wwwroot). Na pasta OrderProc, crie um novo arquivo chamado OrderEntry.asp com o script abaixo. O script usa o banco de dados Access Northwind de exemplo; talvez seja necessário modificar o caminho para o Northwind.mdb na seqüência de conexão (sConn) para coincidir com sua 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 uma solicitação de pedido com êxito, esse script ASP espera dados XML estruturados da seguinte maneira:

<?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>
					
Esse XML designa um pedido para o cliente com a identificação de "BOTTM". A ordem contém dois itens: 11 unidades do produto com a identificação de 4 e 2 unidades do produto com a identificação de 18.

O script ASP não alguns tratamentos de erros para garantir que os clientes têm fornecidas-lo com informações de ordem válida. Clientes devem fornecer um código do cliente e pelo menos um item; se esses critérios não forem atendidos, o script ASP não processa a ordem e retorna um erro.

O script ASP retorna dados XML para clientes que fez uma solicitação de pedido. Esse XML indica sucesso ou falha de processamento de pedidos e também fornece o número da ordem em caso de sucesso:

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

Etapa 2: Criar a interface de pasta de trabalho para entrada de pedido

  1. No Excel, inicie uma nova pasta de trabalho.
  2. Insira rótulos nas células A1, A3, B3 e C3 da seguinte maneira:
    A1:   Customer ID    B1:                C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    					
  3. Selecionar as células a1: B1. No menu Inserir , aponte para nome e, em seguida, clique em criar . Na caixa de diálogo Criar nomes , selecione a Coluna esquerda e clique em OK . Isso cria o nome definido Customer_ID da célula B1.
  4. Selecionar as células A3:C8. No menu Inserir , aponte para nome e, em seguida, clique em criar . Na caixa de diálogo Criar nomes , selecione a Linha superior e clique em OK . Isso cria os nomes definidos Product_ID , quantidade e Preço para células A4:A8 B4:B8 e C4:C8 respectivamente.
  5. Pressione ALT+F11 para iniciar o Editor do Visual Basic.
  6. No Editor do Visual Basic, no menu Inserir , clique em módulo . Adicione a macro a seguir 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
    					
    Observação : alterar YourWebServer na constante de sFolder para o nome do seu servidor Web.

  7. Feche o Editor do Visual Basic e retorne para o Excel.
  8. Salve a pasta de trabalho na pasta OrdrProc criado anteriormente como Invoice1.xls.
O "formulário de ordem" é essencialmente A1:C8 de células. A macro recupera o XMLSS para o formulário de pedido e carrega-lo em um novo objeto DOMDocument . Em seguida, carrega a folha de estilos XSL (linguagem de folha de estilos extensível) em outro DOMDocument e transforma o XMLSS em uma estrutura XML que o ASP pode interpretar como um novo pedido. A macro usa o objeto XMLHTTP para lançar a ordem de XML para o script ASP no servidor Web. O script ASP processa a ordem e retorna mais XML para a macro para informações de status de ordem.

Observação : como uma opção de design, a tarefa de transformar o XMLSS para XML de pedido personalizado é fornecida para o código de macro do lado do cliente. Também é possível lançar o XMLSS para o script ASP e deixar que ASP executar a transformação para você.

Etapa 3: Criar a folha de estilos

Na pasta OrdrProc, criar um novo arquivo 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 para a ordem XML personalizado (ilustrado na etapa 1) da seguinte maneira:
  • O XSL localiza o código do cliente, atravessando a hierarquia de nós até encontrar um nó <cell> que contém o <namedcell> e nós filhos de <data>. Ele verifica que <namedcell> tem um atributo ss:Name igual a 'Customer_ID' e que <data> tem um atributo ss:Type que não seja igual a 'Error'.
  • Para localizar itens para a ordem, o XSL localiza todos os nós <row> com um nó <cell> que contêm um nó filho de <namedcell> com um atributo ss:Name de 'Product_ID' e um nó filho de <data> com um atributo ss:Type que não é 'Error'.
  • Para cada <row> que determina o XSL é um item para a ordem, o XSL usa modelos para corresponder à <namedcell> nós que têm um atributo ss:Name de 'Product_ID', 'Quantidade' e 'Preço'.

Etapa 4: Executar o código de exemplo para processar uma nova ordem

  1. Retornar ao Invoice1.xls no Excel.
  2. Para simular a entrada de ordem, atualizar Sheet1 com informações de cliente e produtos como mostrado 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
    					
    Observação : para esse exemplo, você deve inserir cliente e produto identificações válidas para o script ASP para processar com êxito a ordem.

  3. No menu Ferramentas , aponte para macro e clique em macros . Selecione a macro ProcessOrder na lista e clique em Executar .
  4. Se o script ASP processa com êxito a ordem, você receberá uma mensagem com o novo número de ordem. Inicie o Microsoft Access e abra o banco de dados de exemplo Northwind. Você deve ver uma nova entrada na tabela Pedidos com a identificação ordem retornada do ASP. Você também ver duas novas entradas tabela Detalhes do pedido para a mesma identificação da ordem. Sair do Access e retorne ao Invoice1.xls no Excel.
  5. Desmarque o código do cliente na célula B1 e execute a macro novamente. Desta vez, o servidor está não é possível processar a ordem e retorna um erro indicando que nenhum código do cliente foi fornecido.

Fazer o download

ExcelXML.exe contém o exemplo descrito neste artigo, bem como uma versão aprimorada do Invoice1.xls. Invoice2.xls usa o mesmo script ASP e folha de estilos XSL como Invoice1.xls. No entanto, Invoice2.xls demonstra recursos adicionais do Excel, tais como proteção de planilha, validação de dados e fórmulas PROCV, que você pode usar para fornecer um formulário de ordem mais amigável.

O seguinte arquivo está disponível para download no Centro de download da Microsoft:
Excelxml.exe
Data de lançamento: 3 de abril de 2001

Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Referências

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

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

Guia do desenvolvedor do 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 abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
288215INFO: Excel 2002 and XML
285891Como usar o Visual Basic ou ASP para criar uma planilha XML para o Excel 2002
288130Como usar o ASP para criar a planilha XML para exibição do lado do cliente
(c) Microsoft Corporation 2001, todos os direitos reservados. Contribuições de Lori B. Turner, Microsoft Corporation.

Propriedades

ID do artigo: 278976 - Última revisão: segunda-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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