Générer un état sous word en php

Générer un fichier Word en PHP. (Pour débutants en PHP)

Introduction

Ce document exploite 2 fichiers

  • template.htm qui est le fichier modèle contenant votre lettre type
  • export.php qui est le fichier contenant les sources nécessaires à la création de votre fichier Word.

Le fichier modèle

Le fichier modèle est une page que vous avez créé à l'aide de MS Word version antérieure à 2007.

Voici mon fichier template.htm

 //////////////////////////////////      

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">     

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 11">
<meta name=Originator content="Microsoft Word 11">
<title>$titrefacture</title>
<style>
 @font-face
 {font-family:Tahoma;
 panose-1:2 11 6 4 3 5 4 4 2 4;
 mso-font-charset:0;
 mso-generic-font-family:swiss;
 mso-font-pitch:variable;
 mso-font-signature:1627421319 -2147483648 8 0 66047 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:"";
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 text-autospace:none;
 font-size:10.0pt;
 font-family:"Times New Roman";
 mso-fareast-font-family:"Times New Roman";}
h1
 {mso-style-next:Normal;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 page-break-after:avoid;
 mso-outline-level:1;
 tab-stops:center 248.1pt;
 text-autospace:none;
 font-size:10.0pt;
 font-family:Tahoma;
 mso-font-kerning:0pt;
 text-decoration:underline;
 text-underline:single;}
h2
 {mso-style-next:Normal;
 margin:0cm;
 margin-bottom:.0001pt;
 text-align:center;
 mso-pagination:widow-orphan;
 page-break-after:avoid;
 mso-outline-level:2;
 text-autospace:none;
 font-size:16.0pt;
 font-family:Tahoma;}
h3
 {mso-style-next:Normal;
 margin-top:6.0pt;
 margin-right:0cm;
 margin-bottom:0cm;
 margin-left:0cm;
 margin-bottom:.0001pt;
 text-align:left;
 mso-pagination:widow-orphan;
 page-break-after:avoid;
 mso-outline-level:3;
 text-autospace:none;
 font-size:11.0pt;
 font-family:Tahoma;
 font-style:italic;}
p.MsoHeader, li.MsoHeader, div.MsoHeader
 {margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 tab-stops:center 8.0cm right 16.0cm;
 text-autospace:none;
 font-size:10.0pt;
 font-family:"Times New Roman";
 mso-fareast-font-family:"Times New Roman";}
p.MsoFooter, li.MsoFooter, div.MsoFooter
 {margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 tab-stops:center 8.0cm right 16.0cm;
 text-autospace:none;
 font-size:10.0pt;
 font-family:"Times New Roman";
 mso-fareast-font-family:"Times New Roman";}
 /* Page Definitions */
 @page Section1
 {size:595.3pt 841.9pt;
 margin:1.0cm 1.0cm 39.7pt 42.55pt;
 mso-header-margin:34.0pt;
 mso-footer-margin:39.7pt;
  mso-paper-source:0;}
div.Section1
 {page:Section1;}
 /* List Definitions */
 @list l0
 {mso-list-id:891423539;
 mso-list-type:simple;
 mso-list-template-ids:67895297;}
@list l0:level1
 {mso-level-number-format:bullet;
 mso-level-text:F0B7;
 mso-level-tab-stop:18.0pt;
 mso-level-number-position:left;
 margin-left:18.0pt;
 text-indent:-18.0pt;
 font-family:Symbol;
 mso-bidi-font-family:Symbol;}
ol
 {margin-bottom:0cm;}
ul
 {margin-bottom:0cm;}
</style>
</head>   

<body lang=FR style='tab-interval:35.4pt;text-justify-trim:punctuation'>  

<div class=Section1>      

<p class=MsoNormal><span style='font-size:11.0pt;font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoNormal style='margin-left:248.1pt'><span style='font-size:11.0pt'>$titre<o:p></o:p></span></p>  

<p class=MsoNormal style='margin-left:248.1pt'><span style='font-size:11.0pt'>$nomclient<o:p></o:p></span></p>      

<p class=MsoNormal style='margin-left:248.1pt'><span style='font-size:11.0pt'>$adresseclient<o:p></o:p></span></p>  

<p class=MsoNormal style='margin-left:248.1pt'><b style='mso-bidi-font-weight:
normal'><u><span style='font-size:11.0pt'>$ville - $pays<o:p></o:p></span></u></b></p>       

<p class=MsoNormal style='margin-left:248.1pt'><span style='font-size:11.0pt;
font-family:Tahoma'><o:p> </o:p></span></p>     

<p class=MsoNormal style='margin-left:248.1pt'><span style='font-size:11.0pt;
font-family:Tahoma'><o:p> </o:p></span></p>     

<h2 style='margin-top:36.0pt'>Facture N° $numfacture du $datefacture</h2>   

<p class=MsoNormal align=center style='text-align:center'><span
style='font-family:Tahoma'>Affaire $nomdossier<o:p></o:p></span></p>    

<div style='mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.0pt;
mso-border-bottom-alt:solid windowtext .75pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:99.25pt;margin-right:99.15pt'>   

<p class=MsoNormal align=center style='text-align:center;border:none;
mso-border-bottom-alt:solid windowtext .75pt;padding:0cm;mso-padding-alt:0cm 0cm 1.0pt 0cm'><span
style='font-size:6.0pt;font-family:Tahoma'><o:p> </o:p></span></p>      

</div>    

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
 style='border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-yfti-tbllook:480;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:
 .5pt solid windowtext;mso-border-insidev:.5pt solid windowtext'>
 <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader style='tab-stops:35.4pt'><b><span lang=EN-GB
  style='font-family:Tahoma;mso-ansi-language:EN-GB'>DILIGENCES</span></b><span
  style='font-family:Tahoma'><o:p></o:p></span></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$dil<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style='mso-yfti-irow:1'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader style='tab-stops:35.4pt'><b><span lang=EN-GB
  style='font-family:Tahoma;mso-ansi-language:EN-GB'>SECRETARIAT</span></b><span
  style='font-family:Tahoma'><o:p></o:p></span></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$secret<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style='mso-yfti-irow:2'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader style='tab-stops:35.4pt'><b><span lang=EN-GB
  style='font-family:Tahoma;mso-ansi-language:EN-GB'>FRAIS</span></b><span
  style='font-family:Tahoma'><o:p></o:p></span></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$frais<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style='mso-yfti-irow:3'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader style='tab-stops:35.4pt'><b><span lang=EN-GB
  style='font-family:Tahoma;mso-ansi-language:EN-GB'>DEBOURS</span></b><span
  style='font-family:Tahoma'><o:p></o:p></span></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$deb<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style='mso-yfti-irow:4'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>Total HT<o:p></o:p></span></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$tht<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style='mso-yfti-irow:5'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>TVA<o:p></o:p></span></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$tva<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes'>
  <td width=461 valign=top style='width:345.6pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><b><span
  style='font-size:12.0pt;font-family:Tahoma'>Total TTC</span></b></p>
  </td>
  <td width=248 valign=top style='width:185.8pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoHeader align=right style='text-align:right;tab-stops:35.4pt'><span
  style='font-family:Tahoma'>$ttc<o:p></o:p></span></p>
  </td>
 </tr>
</table>  

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoNormal style='margin-right:-.1pt;tab-stops:right 11.0cm 411.1pt 18.0cm'><b><span
lang=EN-GB style='font-family:Tahoma;mso-ansi-language:EN-GB'><o:p> </o:p></span></b></p> 

<h1><span style='font-weight:normal;mso-bidi-font-weight:bold;text-decoration:
none;text-underline:none'>Date d'échéance : $datech<o:p></o:p></span></h1>      

<h1><span style='font-weight:normal;mso-bidi-font-weight:bold;text-decoration:
none;text-underline:none'><o:p> </o:p></span></h1>      

<h1><span style='font-weight:normal;mso-bidi-font-weight:bold;text-decoration:
none;text-underline:none'><o:p> </o:p></span></h1>      

<h1><span style='font-weight:normal;mso-bidi-font-weight:bold;text-decoration:
none;text-underline:none'><o:p> </o:p></span></h1>      

<h1><span style='font-weight:normal;mso-bidi-font-weight:bold;text-decoration:
none;text-underline:none'><o:p> </o:p></span></h1>      

<h1><span style='font-weight:normal;mso-bidi-font-weight:bold;text-decoration:
none;text-underline:none'><o:p> </o:p></span></h1>      

<h1 align=right style='text-align:right'><span style='font-weight:normal;
mso-bidi-font-weight:bold;text-decoration:none;text-underline:none'><o:p> </o:p></span></h1>    

<h1 align=right style='text-align:right'><span style='font-weight:normal;
mso-bidi-font-weight:bold;text-decoration:none;text-underline:none'><o:p> </o:p></span></h1>    

<h1 align=right style='text-align:right'><span style='font-weight:normal;
mso-bidi-font-weight:bold;text-decoration:none;text-underline:none'><o:p> </o:p></span></h1>    

<h1 align=right style='text-align:right'><span style='font-weight:normal;
mso-bidi-font-weight:bold;text-decoration:none;text-underline:none'><o:p> </o:p></span></h1>    

<h1 align=right style='text-align:right'><span style='font-weight:normal;
mso-bidi-font-weight:bold;text-decoration:none;text-underline:none'>Le service
Comptabilité<o:p></o:p></span></h1>     

<h1 align=right style='text-align:right'><span style='font-weight:normal;
mso-bidi-font-weight:bold;text-decoration:none;text-underline:none'><o:p> </o:p></span></h1>    

<b><u><span style='font-size:10.0pt;font-family:Tahoma;mso-fareast-font-family:
"Times New Roman";mso-ansi-language:FR;mso-fareast-language:FR;mso-bidi-language:
AR-SA'><br clear=all style='page-break-before:always'>
</span></u></b>       

<h1 align=right style='text-align:right'><span style='font-size:12.0pt'>Détail
des prestations facturées - Affaire : $nomdossier<o:p></o:p></span></h1>   

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'><o:p> </o:p></span></p>   

<p class=MsoHeader style='tab-stops:35.4pt'><span style='font-family:Tahoma'>$tableaudetails<o:p></o:p></span></p>  

</div>    

</body>   

</html>
  • Ouvrez donc MS Word, Tapez y votre lettre type. Et à chaque emplacement de données, tapez la $variable php correspondante.
  • Enregistrez votre fichier au format htm (template.htm) à un emplacement facilement accessible à partir de votre application PHP.
  • Ouvrez votre fichier modèle template.htm à l'aide de votre éditeur HTML afin de vérifier que vos variables php introduites à l'aide de MS Word n'ont pas été formatées texte lors de l'enregistrement.
  • Une fois toutes vos variables en bonne forme et place au sein du code HTML de structuration du document, enregistrez et fermez le template.htm.
  • Passez à l'étape 2.

Les variables PHP

J'ai veillé à nommer toutes mes variables dans template.htm par le même nom que j'utiliserais dans export.php

Voici le fichier export.php

  <?   

//Je suppose que vous avez déjà les variables php renseignées. Que ce soit un renseignement statique ou de données provenant de la base de données. Nommez vos variables selon les noms contenus dans le fichier template.htm   

// Je capture et mémorise le contenu du fichier template.htm    

$content=file_get_contents('template.htm'); // Attention au chemin d'accès au fichier template. ici, il est dans le même répertoire que export.php sinon donnez le chemin correct.      

//Maintenant, je remplace une à une les variables. Méthode fastidieuse mais "Cameroun est chaud, on va faire comment". Optimisera au fil de l'expérience        

 $content=str_replace('$titrefacture',$titrefacture,$content);
 $content=str_replace('$titre',$titre,$content);
 $content=str_replace('$nomclient',$nomclient,$content);
 $content=str_replace('$adresseclient',$adresseclient,$content);
 $content=str_replace('$nomclient',$nomclient,$content);
 $content=str_replace('$ville',$ville,$content);
 $content=str_replace('$pays',$pays,$content);
 $content=str_replace('$datejour',$datejour,$content);
 $content=str_replace('$nomdossier',$nomdossier,$content);
 $content=str_replace('$numfacture',$numfacture,$content);
 $content=str_replace('$datefacture',$datefacture,$content);
 $content=str_replace('$dil',$dil,$content);
 $content=str_replace('$secret',$secr,$content);
 $content=str_replace('$frais',$frais,$content);
 $content=str_replace('$deb',$deb,$content);
 $content=str_replace('$tht',$tht,$content);
 $content=str_replace('$tva',$tva,$content);
 $content=str_replace('$ttc',$ttc,$content);
 $content=str_replace('$datech',$datech,$content);
 $content=str_replace('$tableaudetails',$tableaudetails,$content);      

// La suite du fichier à l'étape 3      

?>

La génération et l'ouverture du fichier word

Cette étape consiste à créer le fichier physique sur le disque dur et y accéder.

// Code à insérer dans l'étape 2 EN FIN DE CODE   

 $filename="facture.doc";
 touch($filename);
 if (is_writable($filename)) {
  if (!$handle = fopen($filename, 'a')) {
   echo "Impossible d'ouvrir le fichier ($filename)";
   exit;
  }
  if (fwrite($handle, $content) === FALSE) {
   echo "Impossible d'écrire dans le fichier ($filename)";
   exit;
  }
  echo "<a href='$filename'>Télécharger le fichier</a>";
  fclose($handle);
 } else {
  echo "Le fichier $filename n'est pas accessible en écriture.";
 }

ET VOILA !!!!!

Vous avez un fichier word tout beau avec vos données fusionnées.

Vous avez un affichage de votre fichier en mode "WEB" ? Changez l'affichage en mode "PAGE" pour voir votre fichier word comme d'habitude.

Pour toute question ou recommandation, adressez moi un mail sigapherve at gmail point com et donnez moi le temps de traverser toute la forêt qui me sépare de mon cyber café (env 48h).

Tutoriel proposé par Hervé SIGAP

Douala - Cameroun.

Adresse d'origine

Ce document intitulé « Générer un état sous word en php » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous