Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo
Sommaire > XML > OpenXML (Microsoft Office)
        Qu'est-ce qu'OpenXML ?
        Que faut-il pour lire des documents OpenXML en PHP ?
        Comment créer un document OpenXML ?
        Comment ajouter un paragraphe ?
        Comment mettre du texte dans un paragraphe ?
        Comment mettre du texte en forme ?
1.4.1. Les Parts (9)
                Qu'est-ce qu'une Part dans OpenXML ?
                Comment ajouter une Part à un document OpenXML ?
        1.4.1.1. Les types de contenu (ContentTypes) (4)
                        Comment créer une Part de types pour un document OpenXML ?
                        Comment ajouter un type par défaut ?
                        Comment surcharger un type (override) ?
                        Quels sont les types de contenu pour une Part de document OpenXML ?
        1.4.1.2. Les relations (rels) (2)
                        Comment créer une Part de relations pour un document OpenXML ?
                        Comment ajouter une relation ?
        1.4.1.3. Word (1)
                        Comment créer une Part Word pour un document OpenXML ?
1.4.2. Framework PHP::OpenXML (3)
                Comment lire les propriétés d'un document OpenXML ?
                Comment déterminer le type d'un document OpenXML ?
                Comment convertir un document OpenXML en HTML ?



Qu'est-ce qu'OpenXML ?
auteur : GrandFather
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).

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

Que faut-il pour lire des documents OpenXML en PHP ?
auteur : GrandFather
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 :

lien : faq http://php.developpez.com/faq/tmp/bibliotheques-extensions/?page=divers#extension_installer
lien : fr Structure des fichiers OpenXML, par Eric Grimois
lien : fr Lecture des fichiers OpenXML avec PHP 5, par Eric Grimois

Comment créer un document OpenXML ?
auteur : Guillaume Rossolini
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
<?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
<?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
<?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
<?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();

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

Comment ajouter un paragraphe ?
auteur : Guillaume Rossolini
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') :
$XMLParagraph = $dom->createElement('w:p');
$XMLDocument->appendChild($XMLParagraph);

Comment mettre du texte dans un paragraphe ?
auteur : 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') :
$XMLRun = $dom->createElement('w:r');
$XMLParagraph->appendChild($XMLRun);

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

Comment mettre du texte en forme ?
auteur : 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') :
$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') :
$XMLText = $dom->createElement('w:t', "Du texte en ");
$XMLText->setAttribute('xml:space', 'preserve');
$XMLRun->appendChild($XMLText);


Consultez les autres F.A.Q.


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2003  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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com