IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

[Excel] XML (et DTD ?) depuis XLS


Sujet :

XML/XSL et SOAP

  1. #1
    Futur Membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut [Excel] XML (et DTD ?) depuis XLS
    Bonjour à tous et toutes.

    voici mon souci :
    je dois transformer un document XLS en XML pour le traiter dans une appli off-line.
    Or, je ne sais pas comment faire pour lui donner la structure que je veux ; elle est un peu complexe et je ne sais pas si un fichier DTD peut m'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <personne>
    		<fiche name="Dupont" firstname="Matthieu" DOB="1969" filiere="marketing industriel" promo="1999" diplomeinitial="deug sciences economiques" Langue1="anglais" Langue2="allemand" />
    		<perso adress="2 rue Jean Duville" zip=" 83200" city="Toulon" tel="0494090113" email="mdupont@dcn.fr"/>
    		<pro employeur="DCN Toulon" adresspro="8 rue machin" zip="83800" citypro="Toulon" secteur="chantier naval" fonction="responsable achats projet" telpro="0494026435" url="http://www.dcn-toulon.fr" />
    </personne>
    voilà : les infos d'une personne sont classées en 3 catégories (fiche, perso et pro) et pour chaque partie, plusieurs données sont renseignées de manière à pouvoir trier les personnes par différents critères (essentiellement promo, filière, citypro, secteur, fonction)

    est-ce possible et quelle serait la forme du DTD s'il est nécessaire ?
    et surtout, comment traiter mon XLS pour en faire un fichier XML de ce type ? le mappage XML est-il mon ami ?

  2. #2
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Excel dispose de son propre format XML et il est différent entre Office 2003 et Office 2007... Pour passer d'un format XML à un autre, le plus "simple" est de faire une transformation XSLT.

    Malheureusement rien n'est directement en XML : avec Office 2003, il faut enregistrer dans le format XML; avec Office 2007, le document XML est zippé avec d'autres fichiers.

    Peut-être que pour vous, la solution la plus simple serait de travailler sur format CSV, de construire un XML en automatique à partir du CSV (un bout de code que vous pourrez réutiliser ensuite...) puis d'y appliquer la transformation voulue.

    Dans le projet OpenSource que je développe, j'ai codé de quoi ouvrir un fichier Excel 2003 et en récupérer le contenu en XML, si cela peut vous être utile...

  3. #3
    Futur Membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    Merci bien pour cette réponse Alain.

    Citation Envoyé par alain.couthures
    Excel dispose de son propre format XML et il est différent entre Office 2003 et Office 2007... Pour passer d'un format XML à un autre, le plus "simple" est de faire une transformation XSLT.

    Malheureusement rien n'est directement en XML : avec Office 2003, il faut enregistrer dans le format XML; avec Office 2007, le document XML est zippé avec d'autres fichiers.
    malheureusement, je ne dispose que de Office 2003.. mais je pense pouvoir trouver quelqu'un qui a la version 2007. Si le code XML de 2007 est plus propre que celui de 2003, je peux essayer comme ça.

    Citation Envoyé par alain.couthures
    Peut-être que pour vous, la solution la plus simple serait de travailler sur format CSV, de construire un XML en automatique à partir du CSV (un bout de code que vous pourrez réutiliser ensuite...) puis d'y appliquer la transformation voulue.
    a priori, le fichier excel dont je dispose (récupéré de quelqu'un d'autre.. :/ ) a été traité en CSV (en tout cas c'est le nom de la feuille), mais je ne sais pas en quoi cela peut m'aider.
    La seule chose que j'ai faite dans le fichier XLS, c'est transformer les entêtes de colonnes en listes car c'est sous cette forme qu'excel comprenait un fichier XML test que j'ai créé de toute pièce. je ne sais pas si j'ai bien fait.
    mais j'ai peur de devoir reprendre le fichier XLS manuellement (près de 1800 entrées avec une trentaine de paramètres chacun)

    Citation Envoyé par alain.couthures
    Dans le projet OpenSource que je développe, j'ai codé de quoi ouvrir un fichier Excel 2003 et en récupérer le contenu en XML, si cela peut vous être utile...
    Ah ça oui, c'est exactement ce dont j'ai besoin !!
    j'apprécie grandement cette attention.

  4. #4
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Voici un extrait en C# pour lire un fichier CSV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
                      XmlDocument xDoc = new XmlDocument();
                      xDoc.PreserveWhitespace = true;
                      XmlNode root = xDoc.CreateElement("Elements");
                      xDoc.AppendChild(root);
                      using(StreamReader sr = new StreamReader(n.Attributes.GetNamedItem("filename").Value, Encoding.Default))
                      {
                         char[] sep = {';'};
                         if(!sr.EndOfStream)
                         {
                            Regex invchar = new Regex(@"[^A-Za-z0-9;]+");
                            string[] t = invchar.Replace(sr.ReadLine(), "_").Split(sep);
                            while(!sr.EndOfStream)
                            {
                               string[] l = sr.ReadLine().Split(sep);
                               XmlNode elem = xDoc.CreateElement("Element");
                               root.AppendChild(elem);
                               for(int i = 0; i < Math.Min(l.Length, t.Length); i++)
                               {
                                  if(l[i] != "")
                                  {
                                     XmlNode item = xDoc.CreateElement(t[i]);
                                     item.InnerText = l[i];
                                     elem.AppendChild(item);
                                  }
                               }
                            }
                         }
                      }
    Pour Excel lui-même, je n'ai encore codé que la sauvegarde mais la lecture s'en rapprocherait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Process currentprocess = Process.GetCurrentProcess();
    string tempname = Directory.GetCurrentDirectory() + @&quot;\tempexcel&quot; + currentprocess.Id + &quot;.xml&quot;;
    FileStream fs = new FileStream(tempname, FileMode.Create, FileAccess.Write, FileShare.None);
    StreamWriter sw = new StreamWriter(fs, Encoding.Default);
    sw.WriteLine(&quot;<?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot; standalone=\&quot;yes\&quot;?>&quot;);
    sw.WriteLine(&quot;<?mso-application progid=\&quot;Excel.Sheet\&quot;?>&quot;);
    sw.Write(n.FirstChild.OuterXml);
    sw.Flush();
    sw.Close();
    Excel._Application app = new Excel.Application();
    app.Visible = false;
    Excel.Workbooks workbooks = app.Workbooks;
    object missing = Missing.Value;
    Excel._Workbook workbook = workbooks.Open(tempname, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    try
    {
      File.Delete(n.Attributes.GetNamedItem(&quot;filename&quot;).Value);
    }
    catch {}
    object fileToSave = n.Attributes.GetNamedItem(&quot;filename&quot;).Value;
    object workbooknormal = -4143;
    Excel.XlSaveAsAccessMode nochange = Excel.XlSaveAsAccessMode.xlNoChange;
    workbook.SaveAs(fileToSave, workbooknormal, missing, missing, missing, missing, nochange, missing, missing, missing, missing, missing);
    workbook.Close(missing, missing, missing);
    app.Quit();
    File.Delete(tempname);
    et, enfin, une feuille de style pour transformer un format XML pour Excel 2003 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <xsl:stylesheet version="1.0"
     xmlns:msxsl="urn:schemas-microsoft-com:xslt"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:o="urn:schemas-microsoft-com:office:office"
     xmlns:x="urn:schemas-microsoft-com:office:excel"
     xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
     xmlns:html="http://www.w3.org/TR/REC-html40">
     <xsl:template match="/">
      <xsl:variable name="recname" select="/ss:Workbook/ss:Worksheet[1]/@ss:Name"/>
      <xsl:element name="{concat(translate(normalize-space($recname),&quot; &apos;àâäéèêëîïôöùûüç&quot;,'__aaaeeeeiioouuuc'),'s')}">
       <xsl:apply-templates select="/ss:Workbook/ss:Worksheet[1]/ss:Table[1]/ss:Row[position() != 1]">
        <xsl:with-param name="title" select="/ss:Workbook/ss:Worksheet[1]/ss:Table[1]/ss:Row[1]"/>
        <xsl:with-param name="recname" select="$recname"/>
       </xsl:apply-templates>
      </xsl:element>
     </xsl:template>
     
     <xsl:template match="ss:Row">
      <xsl:param name="title"/>
      <xsl:param name="recname"/>
      <xsl:if test="string(preceding-sibling::ss:Row[1]/ss:Cell[1]/@ss:MergeDown) != '1'">
       <xsl:variable name="row">
        <xsl:copy-of select="."/>
       </xsl:variable>
       <xsl:variable name="nextrow">
        <xsl:copy-of select="following-sibling::ss:Row[1]"/>
       </xsl:variable>
       <xsl:element name="{translate(normalize-space($recname),' àâäéèêëîïôöùûüç','_aaaeeeeiioouuuc')}">
        <xsl:call-template name="rowattr">
         <xsl:with-param name="title" select="$title"/>
         <xsl:with-param name="row" select="msxsl:node-set($row)"/>
         <xsl:with-param name="nextrow" select="msxsl:node-set($nextrow)"/>
         <xsl:with-param name="index" select="1"/>
         <xsl:with-param name="tindex" select="1"/>
         <xsl:with-param name="last" select="count(ss:Cell)"/>
        </xsl:call-template>
       </xsl:element>
      </xsl:if>
     </xsl:template>
     
     <xsl:template name="rowattr">
      <xsl:param name="title"/>
      <xsl:param name="row"/>
      <xsl:param name="nextrow"/>
      <xsl:param name="index"/>
      <xsl:param name="tindex"/>
      <xsl:param name="last"/>
      <xsl:variable name="tindex2">
       <xsl:choose>
        <xsl:when test="$row/ss:Row/ss:Cell[$index]/@ss:Index != ''">
         <xsl:value-of select="$row/ss:Row/ss:Cell[$index]/@ss:Index"/>
        </xsl:when>
        <xsl:otherwise>
         <xsl:value-of select="$tindex"/>
        </xsl:otherwise>
       </xsl:choose>
      </xsl:variable>
      <xsl:variable name="valueattr">
       <xsl:choose>
        <xsl:when test="string($row/ss:Row/ss:Cell[1]/@ss:MergeDown) = '1' and string($row/ss:Row/ss:Cell[$index]/@ss:MergeDown) != '1'">
         <xsl:value-of select="concat($row/ss:Row/ss:Cell[$index]/ss:Data,' - ',$nextrow/ss:Row/ss:Cell/ss:Data)"/>
        </xsl:when>
        <xsl:otherwise>
         <xsl:value-of select="$row/ss:Row/ss:Cell[$index]/ss:Data"/>
        </xsl:otherwise>
       </xsl:choose>
      </xsl:variable>
      <xsl:if test="$valueattr != ''">
       <xsl:attribute name="{translate(normalize-space($title/ss:Cell[number($tindex2)]/ss:Data),&quot; &apos;àâäéèêëîïôöùûüç&quot;,'__aaaeeeeiioouuuc')}">
        <xsl:value-of select="$valueattr"/>
       </xsl:attribute>
      </xsl:if>
      <xsl:if test="$index != $last">
       <xsl:call-template name="rowattr">
        <xsl:with-param name="title" select="$title"/>
        <xsl:with-param name="row" select="$row"/>
        <xsl:with-param name="nextrow" select="$nextrow"/>
        <xsl:with-param name="index" select="$index + 1"/>
        <xsl:with-param name="tindex" select="$tindex2 + 1"/>
        <xsl:with-param name="last" select="$last"/>
       </xsl:call-template>
      </xsl:if>
     </xsl:template>
    </xsl:stylesheet>

  5. #5
    Futur Membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    merci bien, je vais tester tout ça et reviendrai vers vous pour vous faire part de l'issue du projet.


    EDIT >> Oups, je n'avais pas percuté. Du C# ? je n'ai pas le compiler pour ça.
    je ne dispose que de mes petits doigts pour faire ce travail.

  6. #6
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Le compilateur C# est inclu au Framework .Net et il est gratuit !!! gratuit !!! gratuit !!! gratuit !!!! (c'est si rare chez M$ qu'il ne faut pas hésiter à le répéter!!!)

  7. #7
    Futur Membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    merci pour l'info, mais c'est hors de ma portée. je n'ai pas le temps d'apprendre un nouveau langage de prog pour faire ce travail.
    tant pis, je vais surement devoir sous-traiter.

    A moins qu'il y ai une autre solution plus accessible ?

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Et en Java avec l'api JExcel?
    Je crois qu'il existe une ligne de commande avec la lib pour générer directement le xml d'un xls.
    Sinon dans ce sujet ferrero le fait avec un programme très simple:
    http://www.developpez.net/forums/sho...d.php?t=319660

  9. #9
    Futur Membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    effectivement, c'est à creuser
    merci de cette intervention.

Discussions similaires

  1. Générer fichier xml depuis .xls
    Par arimaze dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 23/09/2014, 14h02
  2. [JDOM] Validation fichier XML avec DTD grace à JDOM ?
    Par ederf dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/04/2009, 12h06
  3. Eclipse - plugin - générer une DTD depuis un fichier XML
    Par Invité dans le forum Eclipse PHP
    Réponses: 0
    Dernier message: 06/02/2009, 12h39
  4. de Excel à xml
    Par yos dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 06/09/2005, 14h54
  5. [XML]xml et dtd : récursivité d'un noeud
    Par Jeddo dans le forum Valider
    Réponses: 2
    Dernier message: 29/04/2005, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo