[PS] Lire un document OpenOffice

C'est un fait : OS équipant 90 % des ordinateurs de la planète. Quelques informations, trucs ou astuces afin de mieux l'exploiter.
Bidouille
Webmestre
Messages : 365
Enregistré le : 21 mai 2007 16:08

[PS] Lire un document OpenOffice

Messagepar Bidouille » 07 juil. 2016 14:27

PowerShell (abrégé PS) offre la possibilité de lire facilement du XML. Ca tombe bien puisque le format d'OpenOffice est justement un assemblage de fichiers XML compressé en ZIP. Dès lors, manipuler de l'ODF devient un jeu d'enfant.

Exemple avec un classeur au format ODS :
Image

NB : ce tutoriel n'est pas là pour vous apprendre le langage du PS et si vous avez des questions, consultez un forum dédié comme celui du Labo Microsoft.

1) Extraction des XML
L'ODF est d'abord un ZIP qu'il convient de décompresser

Code : Tout sélectionner

Expand-Archive .\test.ods

2) Récupération du contenu
Le contenu du classeur se trouve logiquement dans le fichier content.xml.
Charger ce contenu est extrêmement simple avec la balise [xml] qui préfixe une variable :

Code : Tout sélectionner

[xml]$contenu = Get-Content -Path .\content.xml
La variable $contenu contient maintenant l'intégralité du XML.

_no_problemo.png
La console affiche dès lors la 1ere ligne du XML
_no_problemo.png (14.56 Kio) Vu 1672 fois


3) Explorer le contenu
Dès lors, il suffit de parcourir la variable $contenu en ajoutant le premier noeud du XML document-content :
xml1.png
xml1.png (34.35 Kio) Vu 1672 fois

Attention : le tiret est un caractère interdit, il convient d'échapper la chaîne avec des apostrophes.

Bidouille
Webmestre
Messages : 365
Enregistré le : 21 mai 2007 16:08

PowerShell avec un ODS : gestion des feuilles

Messagepar Bidouille » 07 juil. 2016 15:59

Nous souhaitons afficher les informations de la 2e feuille d'un classeur ODS.
xml2.png
xml2.png (8.77 Kio) Vu 1674 fois

La partie XML pour cette feuille est la suivante :

Code : Tout sélectionner

<table:table table:name="Feuille2" table:style-name="ta1" table:print="false">
    <table:table-column table:style-name="co1" table:number-columns-repeated="3" table:default-cell-style-name="Default"/>
    [...]
</
table:table>

Pour aller jusqu'à la feuille 2 qui est indexée 1 dans le XML :
xml1.png
xml1.png (17.84 Kio) Vu 1674 fois

La syntaxe pour atteindre une information va devenir de plus en plus longue.
Rien ne m'empêche à manipuler à chaque fois une nouvelle variable telle que :

Code : Tout sélectionner

$feuille2 = $contenu.'document-content'.body.spreadsheet.table[1]

Bidouille
Webmestre
Messages : 365
Enregistré le : 21 mai 2007 16:08

PowerShell avec un ODS : organisation des données

Messagepar Bidouille » 07 juil. 2016 16:13

Les données saisies dans chaque cellule sont organisées par ligne puis par colonne.
Seule la zone comprenant des données est décrite. Dans notre exemple, on voit qu'il s'agit de la plage A1:C6.

Dans le XML, on voit que la ligne 1 est vide avec 3 cellules :

Code : Tout sélectionner

<table:table-row table:style-name="ro1">
     <table:table-cell table:number-columns-repeated="3"/>
</
table:table-row

Puis à la ligne 2, il y a une cellule vide puis la donnée en B2 puis une cellule vide :

Code : Tout sélectionner

<table:table-row table:style-name="ro1">
    <table:table-cell/>
    <table:table-cell office:value-type="string">
        <text:p>Je suis dans la cellule B2</text:p>
    </table:table-cell>
    <table:table-cell/>
</
table:table-row

A la ligne 3, il y a à nouveau une ligne avec 3 cellules vides :

Code : Tout sélectionner

<table:table-row table:style-name="ro1">
    <table:table-cell table:number-columns-repeated="3"/>
</
table:table-row>

Ligne 4, nous avons une donnée en A4 puis 2 cellules vides :

Code : Tout sélectionner

<table:table-row table:style-name="ro1">
    <table:table-cell table:style-name="ce1" office:value-type="date" office:date-value="2016-07-02">
        <text:p>02/07/16</text:p>
    </table:table-cell>
    <table:table-cell table:number-columns-repeated="2"/>
</
table:table-row>

La ligne 5 est décrite comme la ligne 3.

Enfin, la ligne 6 contient d'abord deux cellules vides puis la donnée en C5 :

Code : Tout sélectionner

<table:table-row table:style-name="ro1">
    <table:table-cell table:number-columns-repeated="2"/>
    <table:table-cell office:value-type="float" office:value="5">
        <text:p>5</text:p>
    </table:table-cell>
</
table:table-row>

Bidouille
Webmestre
Messages : 365
Enregistré le : 21 mai 2007 16:08

PowerShell avec un ODS : récupération d'information

Messagepar Bidouille » 07 juil. 2016 16:18

Pour récupérer une information, vous devez l'indexer en partant de 0 pour la ligne puis pour la colonne.
Ainsi pour la cellule B2, je fais :

Code : Tout sélectionner

$ligne2 = $feuille2.'table-row'[1]
$B2 = $ligne2.'table-cell'[1].p

Pour la cellule A4 :

Code : Tout sélectionner

$ligne4 = $feuille2.'table-row'[3]
$A4 = $ligne4.'table-cell'[0].p

etc

Notez aussi que le noeud p n'est pas forcément une donnée fiable.
Il serait préférable d'interroger le noeud table-cell qui renvoie des informations plus précises.


Retourner vers « Windows »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités