Comment faire pour utiliser XSL pour transformer la feuille de calcul XML Excel pour une utilisation côté serveur

Traductions disponibles Traductions disponibles
Numéro d'article: 278976 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Excel 2002 introduit une nouvelle fonctionnalité XML qui permet aux développeurs d'extraire des données mises en forme de feuilles de calcul dans un format XML Spreadsheet (XMLSS). La propriété Value d'un objet Range peut retourner mise en forme de cellule et le contenu au format XMLSS. Feuille de calcul XML est bien formé XML qui peut être chargé par l'analyseur syntaxique XML pour la manipulation au moment de l'exécution. Une utilisation potentielle de cette fonction consiste à valider les données XML à une application serveur pour traitement. Cet article illustre un exemple, dans lequel un classeur Excel est utilisé comme une interface pour un script ASP (Active Server Pages) qui traite les données XML extraites à partir d'une plage dans un classeur.

Cet article vous guide tout au long de la création d'un classeur Excel, un script ASP et une feuille de style que tous les fonctionnent ensemble sous la forme d'un système de traitement des commandes. Tout au long des étapes, explications de chaque composant et il contribue à la solution entière sont corrects. L'exemple décrit dans cet article est également disponible pour téléchargement ; pour les instructions de téléchargement, consultez la section "Téléchargement" à la fin de cet article.

Plus d'informations

Dans cet exemple, différents composants fonctionnent ensemble pour fonctionner comme un processeur de commande :
  • Script ASP. Le composant côté serveur est un script ASP qui accepte les requêtes des clients pour les nouvelles commandes. Le script attend des demandes vers un format XML spécifique. Le script prend les informations à partir du code XML qu'il reçoit et ajoute une nouvelle commande à la base de données exemple Les Comptoirs à l'aide de ActiveX Data Objects (ADO).
  • Classeur Excel. Le composant côté client est un classeur Excel contenant une feuille de calcul pour la saisie de commande et une macro qui interagit avec le script ASP pour traiter le nouvel ordre de l'utilisateur.
  • Feuille de style XSL. Une feuille de style transforme la feuille de calcul XML Excel au format XML personnalisé qui requiert le script ASP. La macro Excel charge la feuille de style et transforme la feuille de calcul XML à la partie XML personnalisée antérieures à la publication des données au script ASP sur le serveur Web.

Étape 1: Création du script de traitement des commandes ASP

Créez un nouveau dossier nommé OrderProc dans le dossier racine virtuel de votre serveur Web (le dossier racine par défaut est C:\inetpub\wwwroot). Dans le dossier OrderProc, créez un nouveau fichier nommé OrderEntry.asp avec le script ci-dessous. Le script utilise l'exemple de base de données Northwind Access ; il est possible que vous deviez modifier le chemin d'accès à Northwind.mdb dans la chaîne de connexion (sConn) en fonction de votre installation 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
 
%> 
				
Pour traiter correctement une requête d'ordre, ce script ASP attend des données XML structurées comme suit :

<?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>
					
Ce XML désigne une commande pour le client avec l'ID du «BOTTM». L'ordre contient deux éléments : 11 unités du produit avec l'ID du 4 et 2 unités du produit avec l'ID du 18.

Le script ASP effectue une gestion d'erreur pour vous assurer que clients ont le fournies avec informations de commande valide. Les clients doivent fournir un code de client et au moins un élément ; si ces critères ne sont pas remplies, le script ASP ne traite pas l'ordre et renvoie une erreur.

Le script ASP renvoie des données XML aux clients qui ont apportées à une requête d'ordre. Ce XML indique la réussite ou l'échec du traitement de commande et fournit également le numéro de commande en cas de réussite :

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

Étape 2: Créer l'interface de classeur pour traitement des commandes

  1. Dans Excel, démarrez un nouveau classeur.
  2. Saisissez les libellés comme suit dans les cellules A1, A3, B3 et C3 :
    A1:   Customer ID    B1:                C1:
    A2:                  B2:                C2:
    A3:   Product ID     B3:   Quantity     C3:   Price
    					
  3. Sélectionnez les cellules a1: B1. Dans le menu Insertion, pointez sur nom, puis cliquez sur créer. Dans la boîte de dialogue Créer des noms, sélectionnez Colonne de gauche, cliquez sur OK. Cela crée le nom défini Customer_ID pour la cellule B1.
  4. Sélectionnez les cellules A3:C8. Dans le menu Insertion, pointez sur nom, puis cliquez sur créer. Dans la boîte de dialogue Créer des noms, sélectionnez la Ligne du haut, cliquez sur OK. Cela crée les noms définis Product_ID, quantité et prix pour les cellules A4:A8, B4:B8 et C4:C8 respectivement.
  5. Appuyez sur ALT + F11 pour démarrer l'éditeur Visual Basic.
  6. Dans Visual Basic Editor, dans le menu Insertion, cliquez sur module. Ajouter la macro suivante dans le module de code :
    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
    					
    Remarque : modifier Votre_serveur_web dans la constante sFolder sur le nom de votre serveur Web.

  7. Fermez l'éditeur Visual Basic et retourner dans Excel.
  8. Enregistrez le classeur dans le dossier OrdrProc créé précédemment comme Invoice1.xls.
Le "bon de commande» est essentiellement cellules A1:C8. La macro extrait la feuille de calcul XML pour le bon de commande et charge dans un nouvel objet DOMDocument. Il charge la feuille de style XSL (Extensible Stylesheet Language) dans un autre DOMDocument et transforme la feuille de calcul XML en une structure XML que l'ASP peut interpréter comme une nouvelle commande. La macro utilise l'objet XMLHTTP pour valider la commande XML au script ASP sur le serveur Web. Le script ASP traite cette commande, puis renvoie XML plus à la macro pour des informations sur le statut des commandes.

Remarque : sous un choix de conception, la tâche de transformation de la feuille de calcul XML vers XML ordre personnalisé bénéficie pour le code côté client. Vous pouvez également valider la feuille de calcul XML au script ASP et laisser ASP exécute la transformation pour vous.

Étape 3: Créer la feuille de style

Dans le dossier OrdrProc, créez un nouveau fichier nommé OrderEntry.xsl et collez le code XSL suivant :
<?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>
				
le langage XSL transforme la feuille de calcul XML à la commande XML personnalisée (illustrée à l'étape 1) comme suit :
  • Le XSL localise le code client en parcourant la hiérarchie de n?ud jusqu'à ce qu'elle rencontre un n?ud <cell>qui contient le <namedcell>et n?uds enfants de <data>. Il vérifie que <namedcell>ss:Name attribut a la valeur pour 'Customer_ID' et que <data>possède un attribut ss:Type qui n'est égale à «Erreur».
  • Pour rechercher des éléments de la commande, celle-ci recherche tous les n?uds <row>avec un n?ud <cell>qui contiennent un n?ud enfant <namedcell>à un attribut ss:Name 'Product_ID' et un n?ud enfant <data>avec un attribut ss:Type qui n'est pas «Erreur».
  • Pour chaque <row>que le code XSL détermine est un élément de la commande, le XSL utilise des modèles pour correspondent aux n?uds <namedcell>possédant un attribut ss:Name de «Product_ID», «Quantité» et «Prix».

Étape 4: Exécution de l'exemple de code de traitement d'une nouvelle commande

  1. Revenir à Invoice1.xls dans Excel.
  2. Pour simuler la saisie de commandes, mettre à jour la feuille Sheet1 avec informations sur les clients et produit comme indiqué ci-dessous :
    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
    					
    Remarque : pour cet exemple, vous devez entrer des ID client et le produit valides pour le script ASP à traiter avec succès la commande.

  3. Dans le menu Outils, pointez sur macro, cliquez sur macros. Sélectionnez la macro ProcessOrder dans la liste et cliquez sur exécuter.
  4. Si le script ASP traite correctement la commande, vous recevez un message avec le nouveau numéro de commande. Démarrez Microsoft Access et ouvrez la base de données exemple Les Comptoirs. Vous devez voir une nouvelle entrée dans la table commandes le code de commande retourné à partir de l'ASP. Vous voyez également deux entrées nouvelles dans la table Détails commandes pour le code de commande même. Quitter Access et revenir à Invoice1.xls dans Excel.
  5. Désactivez le code client dans la cellule B1 et réexécutez la macro. Cette fois, le serveur ne peut pas traiter l'ordre et il retourne une erreur indiquant qu'aucun code client n'a été fournie.

Télécharger

ExcelXML.exe contient l'exemple décrit dans cet article, ainsi que d'une version améliorée de Invoice1.xls. Invoice2.xls utilise le même script ASP et de la feuille de style XSL comme Invoice1.xls. Toutefois, Invoice2.xls illustre des fonctionnalités d'Excel supplémentaires, telles que la protection de la feuille de calcul, validation des données et les formules RECHERCHEV, que vous pouvez utiliser pour fournir un formulaire de commande plus convivial.

Le fichier suivant est disponible au téléchargement à partir du centre de téléchargement Microsoft :
Excelxml.exe
Date de publication: 3 avril 2001.

Pour plus d'informations sur la façon de télécharger des fichiers de support technique Microsoft, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
119591Procédure pour obtenir des fichiers de support technique Microsoft auprès des services en ligne
Microsoft a analysé ce fichier pour les virus. Microsoft utilisé les logiciels de détection de virus les plus récentes ne sont associé à la date à laquelle le fichier a été validé. Le fichier est stocké sur des serveurs sécurisés, empêchant toute modification non autorisée du fichier.

Références

Pour plus d'informations sur l'utilisation de XML et ASP pour créer des solutions côté serveur, consultez les sites de Web MSDN (Microsoft Developer Network) suivant :
Introduction à XML
http://www.microsoft.com/learning/en/us/syllabi/2500AFinal.mspx

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

Guide du développeur XSL
http://msdn.microsoft.com/en-us/library/ms862738.aspx

Envoyer XML entre le client et serveur
http://msdn.microsoft.com/en-us/library/ms763733.aspx

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la base de connaissances Microsoft :
288215INFO : Excel 2002 et XML
285891Comment faire pour utiliser Visual Basic ou ASP pour créer une feuille de calcul XML pour Excel 2002
288130Comment faire pour utiliser ASP pour créer des feuilles de calcul XML à afficher côté client
(c) Microsoft Corporation 2001, tous droits réservés. Contribution de Lori b. Turner, Microsoft Corporation.

Propriétés

Numéro d'article: 278976 - Dernière mise à jour: lundi 29 janvier 2007 - Version: 4.8
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Excel 2002
Mots-clés : 
kbmt kbdownload kbdownload kbfile kbhowto KB278976 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 278976
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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