Documentation/FR/Calc/Import ou export via filtre XML ou XSLT

From Apache OpenOffice Wiki
< Documentation‎ | FR
Revision as of 14:24, 7 July 2018 by Sancho (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Editing.png Cette page est en PROJET et a besoin de votre participation pour sa rédaction.

Introduction

(Cette page est la traduction du fil Create XSLT filters for import and export dans le forum anglais Apache OpenOffice)


Depuis la version 2.x d'OpenOffice, les documents sont enregistrés au format OASIS OpenDocument sous la forme de fichiers XML compressés. En outre OpenOffice supporte également un grand nombre d'autres formats de fichier plus courants comme ceux de la suite Microsoft. Et si tous les formats de fichiers disponibles ne suffisent pas, il y a aussi la possibilité d'ajouter de nouveaux filtres d'importation et d'exportation.

Dans cet exemple, on vous montre comment créer vos propres filtres d'importation et d'exportation sous Calc.

Ressources additionnelles

Pour obtenir la liste complète des noms des balises utilisées dans les documents OpenOffice, se référer à la spécification du format XML à la page suivante : http://xml.openoffice.org/.

Documentation note.png Validation du fichier
  • Il est conseillé de vérifier les fichiers XSLT avec un outil de validation XSLT avant l'import sous Calc. En effet en cas de problème sur le fichier, OpenOffice affiche un message d'erreur ne comportant aucune information quant à l'origine de l'erreur.

Les fichiers

Fichier source de l'exemple

Pour notre exemple, nous allons utiliser un fichier XML simple avec 4 types de données :

  1. purpose: un texte simple,
  2. amount: un nombre avec 2 chiffres après la virgule,
  3. tax: un nombre avec 4 chiffres après la virgule ( bien que des taxes avec autant de précision soient un peu irréalistes ),
  4. maturity: une date.


Le fichier XML de l'exemple est constitué de plusieurs paiements contenant ces champs. Voici le contenu du fichier :

<?xml version="1.0"?>
<payments>
  <payment>
    <purpose>CD</purpose>
    <amount>12.95</amount>
    <tax>19.1234</tax>
    <maturity>2008-03-01</maturity>
  </payment>
  <payment>
    <purpose>DVD</purpose>
    <amount>19.95</amount>
    <tax>19.4321</tax>
    <maturity>2008-03-02</maturity>
  </payment>
  <payment>
    <purpose>Clothes</purpose>
    <amount>99.95</amount>
    <tax>18.5678</tax>
    <maturity>2008-03-03</maturity>
  </payment>
  <payment>
    <purpose>Book</purpose>
    <amount>9.49</amount>
    <tax>18.9876</tax>
    <maturity>2008-03-04</maturity>
  </payment>
</payments>

Enregistrez le fichier en tant que payments.xml, par exemple dans le dossier C:\Temp

Fichier XML généré à l'aide des filtres

Ce fichier est un peu différent. En effet, nous avons ajouté à des fins de démonstration deux éléments attribute à l'élément racine "payments". En utilisant <xsl:attribute name="my-attribute-name"><xsl:value-of select="$someValue"/></xsl:attribute> dans le filtre d'export XSLT, il est possible d'ajouter des attributs à tous les éléments.


<?xml version="1.0" encoding="UTF-8"?>
<payments export-date="2008-01-01" export-user="hol.sten">
  <payment>
    <purpose>CD</purpose>
    <amount>12.95</amount>
    <tax>19.1234</tax>
    <maturity>2008-03-01</maturity>
  </payment>
  <payment>
    <purpose>DVD</purpose>
    <amount>19.95</amount>
    <tax>19.4321</tax>
    <maturity>2008-03-02</maturity>
  </payment>
  <payment>
    <purpose>Clothes</purpose>
    <amount>99.95</amount>
    <tax>18.5678</tax>
    <maturity>2008-03-03</maturity>
  </payment>
  <payment>
    <purpose>Book</purpose>
    <amount>9.49</amount>
    <tax>18.9876</tax>
    <maturity>2008-03-04</maturity>
  </payment>
</payments>


Les filtres

Filtre d'import XSLT

Pour importer le fichier XML d'exemple dans OOo Calc, nous avons besoin d'une feuille de style XSLT. Cette feuille de style créé un fichier XML utilisable par Calc. En voici le code source :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0">
 
   <office:automatic-styles>
 
    <!-- Style des colonnes (co1 : 6 cm de largeur, co2: 3 cm de largeur) -->
    <style:style style:name="co1" style:family="table-column">
     <style:table-column-properties fo:break-before="auto" style:column-width="6.000cm"/>
    </style:style>
    <style:style style:name="co2" style:family="table-column">
     <style:table-column-properties fo:break-before="auto" style:column-width="3.000cm"/>
    </style:style>
 
    <!-- Format des nombres (N36: date au format JJ.MM.AAAA, N107: nombre à virgule à 4 décimales) -->
    <number:date-style style:name="N36" number:automatic-order="true">
     <number:day number:style="long"/>
     <number:text>.</number:text>
     <number:month number:style="long"/>
     <number:text>.</number:text>
     <number:year number:style="long"/>
    </number:date-style>
    <number:number-style style:name="N107">
     <number:number number:decimal-places="4" number:min-integer-digits="1"/>
    </number:number-style>
 
    <!-- Style des cellules (ce1: alignement à droite, ce2: nombre à 4 décimales, ce3: date) -->
    <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default">
     <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/>
     <style:paragraph-properties fo:text-align="end"/>
    </style:style>
    <style:style style:name="ce2" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N107"/>
    <style:style style:name="ce3" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N36"/>
 
   </office:automatic-styles>
 
   <office:body>
    <office:spreadsheet>
     <table:table>
 
      <!-- Application des formats aux 4 premières colonnes du tableau -->
      <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
      <table:table-column table:style-name="co2" table:default-cell-style-name="Default"/>
      <table:table-column table:style-name="co2" table:default-cell-style-name="ce2"/>
      <table:table-column table:style-name="co2" table:default-cell-style-name="ce3"/>
 
      <!-- Ajouter les en-têtes. Premier en-tête style par défaut, les 3 autres sont alignés à droite -->
      <table:table-row>
       <table:table-cell><text:p>Purpose</text:p></table:table-cell>
       <table:table-cell table:style-name="ce1" office:value-type="string"><text:p>Amount</text:p></table:table-cell>
       <table:table-cell table:style-name="ce1" office:value-type="string"><text:p>Tax</text:p></table:table-cell>
       <table:table-cell table:style-name="ce1" office:value-type="string"><text:p>Maturity</text:p></table:table-cell>
      </table:table-row>
 
      <!-- Traitement de la source XML. Insertion d'une ligne pour chaque paiement -->
      <xsl:for-each select="payments/payment">
       <table:table-row>
 
        <!-- Insertion du champ "purpose" -->
        <table:table-cell>
         <text:p><xsl:value-of select="purpose"/></text:p>
        </table:table-cell>
 
        <!-- Insertion du champ "amount" -->
        <table:table-cell office:value-type="float">
         <xsl:attribute name="office:value"><xsl:value-of select="amount"/></xsl:attribute>
         <text:p><xsl:value-of select="amount"/></text:p>
        </table:table-cell>
 
        <!-- Insertion du champ "float" -->
        <table:table-cell office:value-type="float">
         <xsl:attribute name="office:value"><xsl:value-of select="tax"/></xsl:attribute>
         <text:p><xsl:value-of select="tax"/></text:p>
        </table:table-cell>
 
        <!-- Insertion du champ "maturity" -->
        <table:table-cell office:value-type="date">
         <xsl:attribute name="office:date-value"><xsl:value-of select="maturity"/></xsl:attribute>
         <text:p><xsl:value-of select="maturity"/></text:p>
        </table:table-cell>
 
       </table:table-row>
      </xsl:for-each>
     </table:table>
    </office:spreadsheet>
   </office:body>
  </office:document-content>
</xsl:template>
</xsl:stylesheet>

Filtre d'export XSLT

Pour exporter ce fichier d'exemple, nous avons besoin d'une feuille de style XML qui traduise le format Calc. Voici le code source :

<?xmlversion="1.0" encoding="UTF-8"?>
<!--Nous devons définir plusieurs espaces de noms car nous utilisons -->
<!--le modèle de document du fichier OpenOffice.org en mémoire       -->
<!--Si nous souhaitons accéder à plus de propriétés du document,     -->
<!--nous devons ajouter les espaces de noms ici                      -->
<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  exclude-result-prefixes="officetable text">
 
<xsl:outputmethod = "xml" indent = "yes" encoding = "UTF-8"omit-xml-declaration = "no"/>
 
<!--En spécifiant la PropertyValue 'URL' dans les propriétés destoreToURL(),         -->
<!--nous pouvons passer un unique paramètre à cette feuille de style.                -->
<!--Inconvénient : si nous utilisons la propriété 'URL' dans la feuille de style     -->
<!--et que nous l'appelons depuis OOo par le menu« Fichiers » > « Exporter ... »,    -->
<!--OOodéfini une URL de destination. Ce n'est pas forcément ce que nous souhaitons. -->
<xsl:paramname="targetURL"/>
 
<xsl:variablename="exportDate">
 <xsl:choose>
  <xsl:whentest="string-length(substring-before($targetURL,';'))=10">
   <xsl:value-ofselect="substring-before($targetURL,';')"/>
  </xsl:when>
  <xsl:whentest="string-length($targetURL)=10">
   <xsl:value-ofselect="$targetURL"/>
  </xsl:when>
 </xsl:choose>
</xsl:variable>
 
<xsl:variablename="exportUser">
 <xsl:iftest="string-length(substring-after($targetURL,';'))>0">
  <xsl:value-ofselect="substring-after($targetURL,';')"/>
 </xsl:if>
</xsl:variable>
 
<!--Traitement du document OOo -->
<xsl:templatematch="/"> <payments>  <xsl:attributename="export-date"><xsl:value-ofselect="$exportDate"/></xsl:attribute>  <xsl:attributename="export-user"><xsl:value-ofselect="$exportUser"/></xsl:attribute>  <!--Traitementde tout le tableau-->  <xsl:apply-templatesselect="//table:table"/> </payments></xsl:template>
 <payments>
  <xsl:attributename="export-date"><xsl:value-ofselect="$exportDate"/></xsl:attribute>
  <xsl:attributename="export-user"><xsl:value-ofselect="$exportUser"/></xsl:attribute>
  <!--Process all tables -->
  <xsl:apply-templatesselect="//table:table"/>
 </payments>
</xsl:template></xsl:stylesheet>

Utilisation des filtres

Installation des filtres XSLT

Pour installer les filtres, voici la marche à suivre :

  1. Allez dans "Outils" > "Paramétrage des filtres XML..."
  2. Cliquez "Nouveau..."
  3. Dans l'onglet "Général", renseignez le champ "Nom du filtre" avec "Calc_payments", choississez "Calc" pour le champ "Application", entrez "Payments" dans le champ "Nom du type de fichier", ne modifiez pas le champ "Extension de fichier"
  4. Dans l'onglet "Transformation", sélectionnez les filtres XSLT créés précédemment en tant que filtres "XSLT pour export" et "XSLT pour import".
  5. C'est fini, vous n'avez plus qu'à cliquer sur "OK".

Utiliser les filtres XSLT depuis le menu OOo

Pour importer le fichier source XML de l'exemple, faites ceci :

  1. Allez dans "Fichiers" > "Ouvrir..."
  2. Allez dans le dossier où est enregistré le fichier payments.xml
  3. Choississez le type de fichier "Payments (*.xml)" ou "Tous les fichiers"
  4. Sélectionnez le fichier payments.xml
  5. Cliquez sur "Ouvrir".

Si tout s'est bien passé, vous devriez voir 4 colonnes avec en-têtes et 4 enregistrement.

Maintenant, ajoutez un cinquième enregistrement à la suite.

Vous pouvez exporter les enregistrements à l'aide de la boite de dialogue "Fichiers" > "Enregistrer sous...". Il suffit de choisir "Payments (*.xml)" comme type de fichier au moment de l'enregistrement.

Utiliser les filtres XSLT depuis OOo Basic

Voici une simple macro en OOo Basic pour importer l'exemple de fichier XML payments:

REM  *****  BASIC  *****
 
Sub Main
 
rem -------------------------------------------------------
rem - Init import URL
dim xmlurl as string
xmlurl = "file:///C:/Temp/payments.xml"
 
rem -------------------------------------------------------
rem - Import payments
dim properties(0) as new com.sun.star.beans.PropertyValue
properties(0).Name = "FilterName"
properties(0).Value = "Calc_Payments"
 
dim doc As Object
doc = StarDesktop.loadComponentFromURL(xmlurl, "_blank", 0, properties())
 
End Sub

On peut aussi exporter le fichier XML payments avec un script OOo. Une macro OOo Basic simple pour exporter se présente ainsi:

REM  *****  BASIC  *****
 
Sub Main
 
rem -------------------------------------------------------
rem - Get access to the document
dim document as object
document = ThisComponent
 
rem -------------------------------------------------------
rem - Init export URL
dim xmlurl as string
xmlurl = "file:///C:/Temp/payments-export.xml"
 
rem -------------------------------------------------------
rem - Export payments
dim properties(5) as new com.sun.star.beans.PropertyValue
properties(0).Name = "FilterName"
properties(0).Value = "Calc_Payments"
properties(1).Name = "URL"
properties(1).Value = xmlurl
document.storeToURL(xmlurl, properties())
 
End Sub

Références

  1. OpenOffice.org filters using the XML based file format
  2. OASIS OpenDocument file format
  3. Filters and Conversions based on OpenDocument/OpenOffice.org XML
Personal tools