web-dev-qa-db-fra.com

Créer un document Word en utilisant PHP sous Linux

Quelles sont les solutions disponibles pour PHP pour créer un document Word dans un environnement Linux?

59
TechLearner

vrais documents Word

Si vous avez besoin de produire de "vrais" documents Word, vous avez besoin d'un serveur Web Windows et d'une automatisation COM. Je recommande fortement article de Joel à ce sujet.

faux En-têtes HTTP pour inciter Word à ouvrir du HTML brut

Une alternative assez courante (mais peu fiable) est:

header("Content-type: application/vnd.ms-Word");
header("Content-Disposition: attachment; filename=document_name.doc");

echo "<html>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">";
echo "<body>";
echo "<b>Fake Word document</b>";
echo "</body>";
echo "</html>"

Assurez-vous de ne pas utiliser de feuilles de style externes. Tout devrait être dans le même fichier.

Notez que cela n'envoie pas un document Word réel. Il incite simplement les navigateurs à le proposer en téléchargement et à utiliser par défaut un .doc extension de fichier. Les versions plus anciennes de Word peuvent souvent l'ouvrir sans aucun message d'avertissement/de sécurité et simplement importer le HTML brut dans Word. PHP envoi en envoyant ce trompeur Content-Type l'en-tête ne constitue pas une véritable conversion de format de fichier.

33
Sergey Kornilov

PHPWord peut générer des documents Word au format docx. Il peut également utiliser un fichier .docx existant comme modèle - des variables de modèle peuvent être ajoutées au document au format $ {varname}

Il a une licence LGPL et les exemples fournis avec le code ont bien fonctionné pour moi.

29
Highly Irregular

Modèles OpenOffice + OOo interface de ligne de commande.

  1. Créez manuellement un modèle ODT avec des espaces réservés, comme [% value-to-replace%]
  2. Lors de l'instanciation du modèle avec des données réelles en PHP, décompressez le modèle ODT (c'est un XML compressé) et exécutez par rapport au XML le remplacement textuel des espaces réservés avec les valeurs réelles.
  3. Zip l'ODT arrière
  4. Exécutez la conversion ODT -> DOC via l'interface de ligne de commande d'OpenOffice.

Des outils et des bibliothèques sont disponibles pour faciliter chacune de ces étapes.

Peut-être que ça aide.

20
Ivan Krechetov

De loin le moyen le plus simple de créer des fichiers DOC sous Linux, en utilisant PHP est avec le composant Zend Framework phpLiveDocx.

Depuis le site Web du projet:

"phpLiveDocx permet aux développeurs de générer des documents en combinant des données structurées à partir de PHP avec un modèle, créé dans un traitement de texte. Le document résultant peut être enregistré au format PDF, DOCX, DOC ou RTF. Le concept est le même qu'avec le publipostage. "

10
Leo Bonnafe

OpenTBS peut créer des documents dynamiques DOCX dans PHP en utilisant la technique des modèles.

Aucun fichier temporaire nécessaire, aucune ligne de commande, tout en PHP.

Il peut ajouter ou supprimer des images. Le document créé peut être produit sous forme de téléchargement HTML, de fichier enregistré sur le serveur ou de contenu binaire en PHP.

Il peut également fusionner des fichiers OpenDocument (ODT, ODS, ODF, ...)

http://www.tinybutstrong.com/opentbs.php

7
Skrol29

Suite à la réponse d'Ivan Krechetov, voici une fonction qui fait du publipostage (en fait juste un simple remplacement de texte) pour docx et odt, sans avoir besoin d'une bibliothèque supplémentaire.

function mailMerge($templateFile, $newFile, $row)
{
  if (!copy($templateFile, $newFile))  // make a duplicate so we dont overwrite the template
    return false; // could not duplicate template
  $Zip = new ZipArchive();
  if ($Zip->open($newFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
    return false; // probably not a docx file
  $file = substr($templateFile, -4) == '.odt' ? 'content.xml' : 'Word/document.xml';
  $data = $Zip->getFromName($file);
  foreach ($row as $key => $value)
    $data = str_replace($key, $value, $data);
  $Zip->deleteName($file);
  $Zip->addFromString($file, $data);
  $Zip->close();
  return true;
}

Cela remplacera [Nom de la personne] par Mina et [Nom de la personne] par Mooo:

$replacements = array('[Person Name]' => 'Mina', '[Person Last Name]' => 'Mooo');
$newFile = tempnam_sfx(sys_get_temp_dir(), '.dat');
$templateName = 'personinfo.docx';
if (mailMerge($templateName, $newFile, $replacements))
{
  header('Content-type: application/msword');
  header('Content-Disposition: attachment; filename=' . $templateName);
  header('Accept-Ranges: bytes');
  header('Content-Length: '. filesize($file));
  readfile($newFile);
  unlink($newFile);
}

Attention, cette fonction peut corrompre le document si la chaîne à remplacer est trop générale. Essayez d'utiliser des chaînes de remplacement détaillées comme [Nom de la personne].

6
Matiaan

Le projet Apache possède une bibliothèque appelée POI qui peut être utilisée pour générer des fichiers MS Office. C'est une bibliothèque Java mais l'avantage est qu'elle peut fonctionner sur Linux sans problème. Cette bibliothèque a ses limites mais elle peut faire le travail pour vous, et elle est probablement plus simple à utiliser qu'à essayer. pour exécuter Word.

Une autre option serait OpenOffice mais je ne peux pas exactement le recommander car je ne l'ai jamais utilisé.

3
<?php
function fWriteFile($sFileName,$sFileContent="No Data",$ROOT)
    {
        $Word = new COM("Word.application") or die("Unable to instantiate Word");
        //bring it to front
        $Word->Visible = 1;
        //open an empty document
        $Word->Documents->Add();
        //do some weird stuff
        $Word->Selection->TypeText($sFileContent);
        $Word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc");
        //closing Word
        $Word->Quit();
        //free the object
        $Word = null;
        return $sFileName;
    }
?>



<?php
$PATH_ROOT=dirname(__FILE__);
$Return ="<table>";
$Return .="<tr><td>Row[0]</td></tr>";
 $Return .="<tr><td>Row[1]</td></tr>";
$sReturn .="</table>";
fWriteFile("test",$Return,$PATH_ROOT);
?> 
3
hoang

Il existe 2 options pour créer des documents Word de qualité. Utilisez COM pour communiquer avec Word (cela nécessite au moins un serveur php Windows). Utilisez openoffice et son API pour créer et enregistrer des documents au format Word.

0
DreamWerx

Jetez un œil à PHP documents COM (les commentaires sont utiles) http://us3.php.net/com

0
JREAM