Soutenez-nous

FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireBibliothèques, extensionsXMLOpenXML (Microsoft Office)

OpenXML est le format de fichier adopté par les documents de la suite Microsoft Office 2007, à partir de la version 2007. Ce format, fruit de la collaboration de Microsoft, d'Intel et d'Apple, entre autres, est totalement libre de royalties, et sa pérennité et son indépendance vis-à-vis de tout éditeur sont garanties par son élévation au rang de norme par l'ECMA (le standard ISO devrait bientôt suivre).

Créé le 2 juin 2007  par GrandFather

Lien : Structure des fichiers OpenXML
Lien : Rubrique XML : Cours, tutoriels, FAQ, Sources, Livres, Forums

Les documents OpenXML Office sont en réalité des archives compressées de documents XML. À ce titre, la meilleure configuration pour lire ces documents est :

Créé le 1er mars 2007  par GrandFather

Lien : Comment installer une extension pour PHP ?
Lien : Structure des fichiers OpenXML, par Eric GrimoisTutoriel sur la structure des fichiers OpenXML
Lien : Lecture des fichiers OpenXML avec PHP 5, par Eric GrimoisTutoriel sur la lecture des fichiers OpenXML avec PHP5
Lien : Qu'est-ce que l'extension ZIP ?

Un document OpenXML est en fait une archive ZIP.

Cette archive contient au minimum (cas d'un document Word) :
  • /[Content_Types].xml : Définit les types de fichiers contenus dans l'archive ;
  • /_rels/.rels : Définit les relations entre les fichiers de l'archive ;
  • /word/document.xml : La Part principale.
/[Content_Types].xml
Sélectionnez
<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
    <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
    <Default Extension="xml" ContentType="application/xml" />
    <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" />
</Types>
/_rels/.rels
Sélectionnez
<?xml version="1.0" encoding="utf-8" ?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml" />
</Relationships>
/word/document.xml
Sélectionnez
<?xml version="1.0" encoding="utf-8" ?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    <w:body>
        <w:p>
            <w:r>
                <w:t>Hello world!</w:t>
            </w:r>
        </w:p>
    </w:body>
</w:document>

Compresser cette arborescence au format ZIP et renommer en .docx suffit pour que Word 2007 ouvre un document "Hello world!".

Le script suivant permet de créer un document Word 2007 de toutes pièces, grâce à PHP 5 :

hello-world.php
Sélectionnez
<?php

$types = new DOMDocument('1.0', 'utf-8');

$XMLTypes = $types->createElement('Types');
$XMLTypes->setAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types');
$types->appendChild($XMLTypes);

$XMLType = $types->createElement('Default');
$XMLType->setAttribute('Extension', 'rels');
$XMLType->setAttribute('ContentType', 'application/vnd.openxmlformats-package.relationships+xml');
$XMLTypes->appendChild($XMLType);

$XMLType = $types->createElement('Default');
$XMLType->setAttribute('Extension', 'xml');
$XMLType->setAttribute('ContentType', 'application/xml');
$XMLTypes->appendChild($XMLType);

$XMLType = $types->createElement('Override');
$XMLType->setAttribute('PartName', '/word/document.xml');
$XMLType->setAttribute('ContentType', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml');
$XMLTypes->appendChild($XMLType);


$rels = new DOMDocument('1.0', 'utf-8');

$XMLRels = $rels->createElement('Relationships');
$XMLRels->setAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
$rels->appendChild($XMLRels);

$XMLRel = $rels->createElement('Relationship');
$XMLRel->setAttribute('Id', 'rId1');
$XMLRel->setAttribute('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument');
$XMLRel->setAttribute('Target', 'word/document.xml');
$XMLRels->appendChild($XMLRel);


$word = new DOMDocument('1.0', 'utf-8');

$XMLDocument = $word->createElement('w:document');
$XMLDocument->setAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
$word->appendChild($XMLDocument);

$XMLBody = $word->createElement('w:body');
$XMLDocument->appendChild($XMLBody);

$XMLParagraph = $word->createElement('w:p');
$XMLBody->appendChild($XMLParagraph);

$XMLRun = $word->createElement('w:r');
$XMLParagraph->appendChild($XMLRun);

$XMLText = $word->createElement('w:t', utf8_encode("Hello world!"));
$XMLRun->appendChild($XMLText);


$document = new ZipArchive();
$document->open('hello-world.docx', ZIPARCHIVE::OVERWRITE);

$document->addFromString('[Content_Types].xml', $types->saveXML());
$document->addFromString('_rels/.rels', $rels->saveXML());
$document->addFromString('word/document.xml', $word->saveXML());

$document->close();

?>
Créé le 2 juillet 2007  par Guillaume Rossolini

Lien : Comment créer une Part de relations pour un document OpenXML ?
Lien : Comment créer une Part de types pour un document OpenXML ?
Lien : Comment créer une Part Word pour un document OpenXML ?

Un paragraphe est un élément 'p' contenant :
  • Un élément "pPr" facultatif (propriétés de paragraphe) ;
  • Un élément "rPr" facultatif (propriétés de run) ;
  • Un ou plusieurs éléments "r" (run).
Dans le cas de Word (namespace 'w') :
Sélectionnez
$XMLParagraph = $dom->createElement('w:p');
$XMLDocument->appendChild($XMLParagraph);
Créé le 2 juillet 2007  par Guillaume Rossolini

Il faut ajouter un élément "r" (run) à un paragraphe, puis un élément "t" (text) à ce run.

Dans le cas de Word (namespace 'w') :
Sélectionnez
$XMLRun = $dom->createElement('w:r');
$XMLParagraph->appendChild($XMLRun);

$XMLText = $dom->createElement('w:t', "Du texte ici...");
$XMLRun->appendChild($XMLText);
Créé le 2 juillet 2007  par Guillaume Rossolini

Chaque run a ses propriétés, par exemple mise en gras, italique, etc. Ainsi, le texte doit être divisé en runs ayant une mise en forme commune.

À titre d'exemple, le texte suivant devra être divisé en 3 runs (normal, gras, normal) : "Du texte en gras."

Dans le cas de Word (namespace 'w') :
Sélectionnez
$XMLParagraph = $dom->createElement('w:p');
$XMLDocument->appendChild($XMLParagraph);

// Premier run (normal)
$XMLRun = $dom->createElement('w:r');
$XMLParagraph->appendChild($XMLRun);

$XMLText = $dom->createElement('w:t', "Du texte en ");
$XMLRun->appendChild($XMLText);


// Second run (avec la propriété "b" pour "bold/gras")
$XMLRun = $dom->createElement('w:r');
$XMLParagraph->appendChild($XMLRun);

$XMLRPr = $dom->createElement('w:rPr');
$XMLRun->appendChild($XMLRPr);

$XMLBold = $dom->createElement('w:b');
$XMLRPr->appendChild($XMLBold);

$XMLText = $dom->createElement('w:t', "gras");
$XMLRun->appendChild($XMLText);


// Troisième run (normal)
$XMLRun = $dom->createElement('w:r');
$XMLParagraph->appendChild($XMLRun);

$XMLText = $dom->createElement('w:t', ".");
$XMLRun->appendChild($XMLText);

N. B. : Il faut ajouter l'attribut "xml:space" avec la valeur "preserve" pour que les espaces soient conservés entre les runs.

Dans le cas de Word (namespace 'w') :
Sélectionnez
$XMLText = $dom->createElement('w:t', "Du texte en ");
$XMLText->setAttribute('xml:space', 'preserve');
$XMLRun->appendChild($XMLText);
Créé le 2 juillet 2007  par Guillaume Rossolini
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.