PHPWord exportation donnant Corruption de Fichier Word
J'ai utilisé le code d'exemple de PHPWord du site: http://phpword.codeplex.com/documentation
Et quand j'ai essayer de l'ouvrir avec Word, je reçois l'erreur "Le fichier Office Open XML test.docx ne peut pas être ouvert car il y a des problèmes avec le contenu." et quand je clique sur "Détails", Il dit simplement "Le fichier est corrompu et ne peut pas être ouvert." Il ne permettez-moi de le réparer et de l'ouvrir, mais ce ne serait pas très convivial... Voici le code que j'utilise:
//Create a new PHPWord Object
$PHPWord = new PHPWord();
//Every element you want to append to the word document is placed in a section. So you need a section:
$section = $PHPWord->createSection();
//After creating a section, you can append elements:
$section->addText('Hello world!');
//You can directly style your text by giving the addText function an array:
$section->addText('Hello world! I am formatted.', array('name'=>'Tahoma', 'size'=>16, 'bold'=>true));
//If you often need the same style again you can create a user defined style to the word document
//and give the addText function the name of the style>:
$PHPWord->addFontStyle('myOwnStyle', array('name'=>'Verdana', 'size'=>14, 'color'=>'1B2232'));
$section->addText('Hello world! I am formatted by a user defined style', 'myOwnStyle');
//You can also putthe appended element to local object an call functions like this:
$myTextElement = $section->addText('Hello World!');
header('Content-Type: application/vnd.ms-word');
header('Content-Disposition: attachment;filename="test.docx"');
header('Cache-Control: max-age=0');
//At least write the document to webspace:
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('php://output');
Comme vous pouvez le voir j'ai fait usage de php://output comme le sauvegarder. Toutes les idées sur la façon de se débarrasser de la corruption. J'ai ouvert la fermeture éclair et vu qu'à la fin de document.xml il semble y avoir de ligne vide. Peut-être que c'est la cause?
Merci!
Attention aux espaces (ou d'une autre écho caractères) que votre script peut être insérer dans le navigateur de sortie
La différence que je vois, c'est que document.xml a <w:p w:rsidR="007F0142" w:rsidRDefault="007F0142"/> dans le réparé copie et il n'a pas les sauts de ligne.
Vous pouvez voir de quoi je suis sortie ci-dessus.
Je ne peux pas voir tout ce que vous êtes de sortie, ce qui est en cours de sortie entre $PHPWord = new PHPWord(); et $objWriter->save('php://output'); - vous pouvez enregistrer dans un fichier plutôt que de php://output et de regarder pour de grands espaces, des messages d'erreur, de la NOMENCLATURE des marqueurs ou que ce soit dans ce fichier
OriginalL'auteur oneadvent | 2011-12-20
Vous devez vous connecter pour publier un commentaire.
Juste ajouter ob_clean(); avant la sortie!
Ce sera propre, vous r'sortie, et maintenant vous êtes sûr de générer un fichier docx 🙂
OriginalL'auteur Oliver Markovic
Je sais que c'est une vieille question, mais j'ai eu exactement le même problème et trouvé la solution la plus simple de toutes. Le problème que j'ai eu, c'est que je suis à l'aide de Symfony, et que lors de la génération du fichier, j'ai dû modifier le fichier avec Notepad++ pour voir qu'il y avait des messages d'erreur après que le contenu, en disant que le contrôleur a besoin d'une Réponse().
J'ai donc fini par mettre
exit;
juste après la->save()
, et il a bien fonctionné.OriginalL'auteur Cryborg
Le Texte que vous ajoutez ne doit pas contenir les caractères HTML. Convertir toutes les lois de caractères en entités HTML par exemple, si vous avez à ajouter le "Moi & mon Code" d'abord cela:
Utiliser la fonction Builtin pour enregistrer le fichier. les fichiers docx sont des fichiers zip (vous pouvez les ouvrir dans winrar ou winzip) de sorte que vous ne devriez pas utiliser php://output
Cette façon, le fichier sera créé, puis téléchargés par l'utilisateur.
Côté Remarque: les fichiers docx sont en fait des fichiers XML. De sorte que toute xml réserve personnage sera endommagé le fichier. Une solution de contournement est de convertir votre texte comme suit
Souhaitez-moi un lien vers le fichier créé? Voici le code: pastebin.com/Jf1pshzE
les fichiers docx sont des fichiers xml de sorte que vous devriez aussi essayer de ne pas ajouter les caractères html dans votre texte. Mieux vaut utiliser la fonction suivante pour convertir htmlentities pour xmlentities
Je peux confirmer que xmlEntities fonctionne avec la fonction setValue c'est dans le TemplateProcessor. Merci @UsmanShaukat!
glad je peux vous aider
OriginalL'auteur Usman Shaukat
OriginalL'auteur Siva
Cette solution a fonctionné pour moi
OriginalL'auteur Juan Bilardi
Ajouter
setCompatibility()
avantcreateWriter()
Ajouter
exit;
après lasave()
OriginalL'auteur Dong Zen