FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
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 : 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 :
- Avoir PHP >= 5.2
- Activer les extensions XSL et ZIP
- Utiliser le framework PHP::OpenXML développé par Éric Grimois
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.
- /[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.
<?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>
<?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>
<?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 :
<?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 : 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 é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).
$XMLParagraph
=
$dom
->
createElement('
w:p
'
);
$XMLDocument
->
appendChild($XMLParagraph
);
Il faut ajouter un élément "r" (run) à un paragraphe, puis un élément "t" (text) à ce run.
$XMLRun
=
$dom
->
createElement('
w:r
'
);
$XMLParagraph
->
appendChild($XMLRun
);
$XMLText
=
$dom
->
createElement('
w:t
'
,
"
Du texte ici...
"
);
$XMLRun
->
appendChild($XMLText
);
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."
$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.
$XMLText
=
$dom
->
createElement('
w:t
'
,
"
Du texte en
"
);
$XMLText
->
setAttribute('
xml:space
'
,
'
preserve
'
);
$XMLRun
->
appendChild($XMLText
);