Remplir un fichier Word type avec des valeurs en POST PHP [Résolu]

Signaler
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
-
Messages postés
6
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
7 juillet 2017
-
Bonjour, je suis étudiante en dév info et j'ai un travail à rendre prochainement.
Il s'agit d'un formulaire html qui doit générer un fichier Word par la suite afin que le client l'enregistre sur son pc, le signe et le renvoi dans un mail en tant que pièce jointe.
On m'a conseillé d'utiliser la librairie PHPWord et c'est ce que j'ai fait.
Là je suis au niveau de la génération du doc word.
Le code des différents fichiers utilisés se présente comme suite:

-Formulaire-
<form id="form10" name="form10" method="post" action="exporter.php" onclick="">
          <p>Nom du Client :   
            <input type="text" name="nomClient" id="nomClient" />
          </p>
          <p>Adresse de facturation :
          <input type="text" name="adresseFact" id="adresseFact" />
          </p>
       <input align="right" name="export" type="submit" id="export" value="exporter" />    </form>


-exporter.php-
<?php
require_once '../PHPWord.php';
$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate('modele.docx');

$nomClient = isset($_POST['nomClient']) ? $_POST['nomClient'] : '';
$adresseFact = isset($_POST['adresseFact']) ? $_POST['adresseFact'] : '';

$document->setValue('nomClient', $nomClient);
$document->setValue('adresseFact', $adresseFact);

$document->save('modele_fin.docx');
?>


-fichier modele.docx-

Nom du client Adresse de facturation
${nomClient} ${adresseFact}

Biensûr, le phpword.php et son dossier sont dans le dossier racine de l'exécution.
Qu'est-ce qui cloche à votre avis?

13 réponses

Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Je pense avoir trouvé ...


Dans le dossier PhpWord ... modifie le fichier Template.php
Remplace la fonction setvalue existante par celle-ci :
	public function setValue($search, $replace, $limit=-1) {
		if(substr($search, 0, 1) !== '{' && substr($search, -1) !== '}') {
			$search = '{'.$search.'}';
		}
		preg_match_all('/\{[^}]+\}/', $this->_documentXML, $matches);
		foreach ($matches[0] as $k => $match) {
			$no_tag = strip_tags($match);
			if ($no_tag == $search) {
				$match = '{'.$match.'}';
				$this->_documentXML = preg_replace($match, $replace, $this->_documentXML, $limit);	
				if ($limit == 1) {
					break;
				}			
			}
		}
	}


Messages postés
132
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
12 novembre 2019

Salut,
Pour ma part je n'utilise aucune librairie
je fait le masque sous word, je sauvegarde en RTF

puis :
$envoi_reception = file_get_contents('<bold>entete.rtf</bold>');
$envoi_reception = str_replace('<bold><nom></bold>',$fiche,$envoi_reception);
$envoi_reception = str_replace('<bold><adr1></bold>',$adr,$envoi_reception);
$envoi_reception = str_replace('<bold><ville></bold>',$ville,$envoi_reception);

$monfichier = fopen('<bold>creation.txt</bold>', 'w+');
fputs($monfichier, $envoi_reception);
fclose($monfichier);
rename("creation.txt", "<bold>courrier_contact.rtf</bold>"); 
 



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Merci d'y penser dans tes prochains messages.
.

Beau temps belle mer
Jorgio
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Bonjour,

@eli42 : ta solution fonctionne.. à condition que le document ne soit pas un WORD (avec toutes les possibilités que word offre comparé à un "simple" document RTF.

@Tl_IT
Je t'ai répondu dans ta question initiale :
http://www.commentcamarche.net/forum/affich-32067759-champs-d-un-formulaire-generes-dans-un-doc#p32076953

Par contre je vois que tu as modifié le chemin vers le fichier phpword (../PHPWord.php) .. il faudra le modifier également dans le code que je t'ai donné sur CCM.

PS : Juste au cas où.. tu as testé les fichiers d'exemple fournis avec phpword ?
juste pour voir si ils fonctionnent .... ??
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Salut Jordane! j'ai essayé d'exécuter l'exemple et ça n'a pas marché, du coup je comprends pourquoi ça bloqué dans mon exemple.
J'ai juste mis une page php avec un bouton où l'action exécute "Template.php".
Ci-dessous ce qu'on m'affiche après exécution:


Merci pour ton aide.
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
... vu l'url qui apparait dans ton navigateur .. c'est normal !

Tu as bien installé un serveur php sur ton pc ? un truc du genre WAMP ou EASYPHP ??
.... ensuite, il faut afficher ta page web en passant par le LOCALHOST ... et non en cliquant directement sur ton fichier php !


Si tu ne sais pas comment faire... je t'invite à commencer par regarder les tutoriels pour apprendre à utiliser ton serveur php.
C'est le BaBa..;avant même de commencer à écrire du code !
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Déjà merci d'avoir remarqué ça, parce que j'arrive pas à croire que je l'ai zappé!
J'ai refais le test de l'exemple et EVIDEMMENT :) le fichier docx a été crée avec les valeurs passées du Template.php (sun, jupiter...).
J'ai refais le test avec le formulaire, les valeurs ont été affichées(voir ci-dessous):


Par contre, la valeur de la variable POST $nomClient n'a pas été transmis au document(cadré en bleu).

Qu'est ce que tu en dis Jordane45? Merci de me répondre.
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Vu comment s'affiche nomclient dans ta page php ... il semble que tu aies un souci d'encodage.
il faudrait que tu mettes tes pages en UTF8.

A la limite... dans un premier temps... commence par tester sans mettre de caractères accentués dans tes input pour voir si ça fonctionne.
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Je l'ai fait, mais jusque là c'est pas un problème d'encodage.
Si tu remarques dans le code ci-dessous de Template.php, j'ai fais le test pour $nom (=Pluto) mais çca ne passe pas alors que les autres valeurs au dessus passent sans problème.
<?php
require_once '../PHPWord.php';

header('Content-type: application/json; charset=UTF-8');

// rédupération des variables

$nomClient = isset($_POST['nomClient']) ? $_POST['nomClient'] : '';
$adresseFact = isset($_POST['adresseFact']) ? $_POST['adresseFact'] : '';

$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate('Template.docx');

$document->setValue('Value1', 'Sun');
$document->setValue('Value2', 'Mercury');
$document->setValue('Value3', 'Venus');
$document->setValue('Value4', 'Earth');
$document->setValue('Value5', 'Mars');
$document->setValue('Value6', 'Jupiter');
$document->setValue('Value7', 'Saturn');
$document->setValue('Value8', 'Uranus');
$document->setValue('Value9', 'Neptun');

//test pour voir si la valeur de $nom passe au niveau du Template.docx
$document->setValue('nom', 'Pluto');

$document->setValue('nomClient', $nomClient);
$document->setValue('adresseFact', $adresseFact);

// le temps des tests :
echo "nomclient : ".$nomClient ;

echo "adresseFact : ".$adresseFact ;

$document->setValue('weekday', date('l'));
$document->setValue('time', date('H:i'));

$document->save('Solarsystem.docx');
?>


Peux-tu stp faire le test de ton coté en utilisant ce code et en ajoutant ${nom} dans le Template.docx afin de savoir si ça vient du code ou autre chose.

Merci!!
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

jordanee45 voici l'affichage après le submit et le docx généré:
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Peux-tu nous faire une capture écran de ton fichier template Template.docx ?
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
De mon côté .. je viens de tester et ça fonctionne :
<?php
/* 
test PHP WORD
*/

// on se met en UTF8
header('Content-Type: text/html; charset=utf-8');

//affichage des erreurs PHP
error_reporting(E_ALL);

// import de la class PhpWord
require_once 'PHPWord.php';

// VARIABLES :
$docName = "Mon_nouveau_doc.docx";
$docModele = 'Template.docx';

// r?p?tion des variables POST
$nomClient = isset($_POST['nomClient']) ? $_POST['nomClient'] : 'test nom avec accents éééèèè@@@';
$adresseFact = isset($_POST['adresseFact']) ? $_POST['adresseFact'] : '121 .....';

// le temps des tests :
echo "nomclient : ".$nomClient ;
echo "adresseFact : ".$adresseFact ;


//---------------------------------------------//
// Cr?ion du document WORD :
//---------------------------------------------//
$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate($docModele);

$document->setValue('nomclient', $nomClient);
$document->setValue('adresseFact', $adresseFact);

$document->save($docName);  


?>




Avec, comme document template :


The following table contains a few values that can be edited by the PHPWord_Template class. You just can edit single-line of text elements. The format and the rest of the document stay untouched.

${nomclient}
${adresseFact}


Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

J'ai pris le même code que tu as utilisé avec le même modèle docx et toujours sans succès :( . Ci-dessous les deux fichiers:
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Le formulaire:

<form id="form10" name="form10" method="post" action="Template.php" onclick="">
<p>Nom du Client :
<input type="text" name="nomClient" id="nomClient" />
</p>
<p>Adresse de facturation :
<input type="text" name="adresseFact" id="adresseFact" />
</p>
<input align="right" name="export" type="submit" id="export" value="exporter" /> </form>


Merci pour ton aide encore une fois.
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Ben là .. je n'ai plus aucune idée...
A la limite ... vide totalement le cache de ton navigateur et re-teste...

Sinon.. je ne sais pas.
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

OUI CA MARCHE!!!! Je te remercie énormemment, tu me sauves là!
Finalement, je peux boucler cette première partie.
Je ne veux pas abuser jordane45, mais je voulais te demander si je peux afficher juste après le submit la petite fenêtre de télechargement du docx (Ouvrir/Enregistrer).
Aussi pour que je reste sur ma page formulaire, je sais qu'il faut mettre action="<?php echo($_SERVER['PHP_SELF']); ?>", mais si je fais ça comment exécuter le script.php au niveau de onclick?

Merci pour ton retour.
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328

je sais qu'il faut mettre action="<?php echo($_SERVER['PHP_SELF']); ?>"

Non .. il suffit de mettre une chaine vide.
<form id="form10" name="form10" method="post" action="">

... et bien entendu .. avoir mis le code php de ta page Template.php ... DANS la même page que ton formulaire ( ou en faire un INCLUDE ).
Pour ce qui est du téléchargement... proposes donc un LIEN vers ton fichier ... c'est plus simple à gérer.

Sinon.. tu peux essayer de faire quelque chose du genre :

//affichage des erreurs PHP
error_reporting(E_ALL);

// import de la class PhpWord
require_once 'PHPWord.php';


//Variables
$docName = "Mon_nouveau_doc.docx";
$docModele = 'Template.docx';

// recuperation des variables POST
$nomClient = isset($_POST['nomClient']) ? $_POST['nomClient'] : 'test nom avec accents éééèèè@@@';
$adresseFact = isset($_POST['adresseFact']) ? $_POST['adresseFact'] : '121 .....';

// le temps des tests :
echo "nomclient : ".$nomClient ;
echo "adresseFact : ".$adresseFact ;

$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate($docModele);
$document->setValue('nomclient', $nomClient);
$document->setValue('adresseFact', $adresseFact);

// nom temporaire donné au fichier que tu créés ..
$temp_file = tempnam(sys_get_temp_dir(), 'PHPWord');
$document->save($temp_file);

// Le fichier téléchargé aura comme nom :  $docName 
header("Content-Disposition: attachment; filename='".docName ."'");
readfile($temp_file);
unlink($temp_file);  // suppression du fichier temporaire sur le serveur
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
>
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020

Dans ton code le contenu de la page du formulaire est transmis au nouveau fichier, et non ce qui a été généré du Template.docx (voir message ci-dessous).
Comment faire pour ouvrir le fichier "Mon_nouveau_doc.docx" après qu'il soit enregistrer $document->save.... ?
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015



Merci pour ton retour.
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Je crois que dans la librairie PHPWord, il n'y a pas comment ouvrir un fichier word fraichement généré.
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Il est possible de faire ça avec COM, mais qui bloque malheureusement au niveau de l'instanciation de l'objet COM:
Fatal error: Class 'COM' not found

// Lancement de word
$word = new COM("word.application") or die("Impossible de démarrer le composant word");

// On masque word (pour ne pas afficher la fenêtre, et l'exécuter en arrière-plan)
$word->Visible = 0;

// Ouverture du fichier word (doc ou docx)
$word->Documents->Open($docName);

// Fermeture de word
$word->Quit();

// Libération mémoire
$word->Release();
$word = null;
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Aidez-moi svp!!
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Tu ne peux pas l'ouvrir en PHP (ni en javascript d'ailleurs !!!)

PHP s'exécute côté SERVEUR !
Seul le JAVASCRIPT s'exécute côté POSTE utilisateur .... mais il n'existe rien en JAVASCRIPT qui permette de lire un fichier (word ou autre.....)

Donc .. TU NE PEUX PAS !

La seule chose que tu peux faire (et il me semblait te l'avoir dit sur l'autre forum...) c'est le LIRE avec PHPWORD .. et afficher les informations dans une page web....
Mais tu ne peux pas ouvrir directement un document word depuis ton site.. impossible !


Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Merci pour cette information Jordane, je comprends mieux maintenant.
Mais ceci dit, est-ce que je peux enregistrer le fichier "Mon_nouveau_doc.docx" du coté utilisateur après qu'il soit généré au niveau du serveur?
Pour que l'utilisateur l'ouvre par la suite de son côté, édite, et upload, toujours dans le formulaire.
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328 >
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015


, est-ce que je peux enregistrer le fichier "Mon_nouveau_doc.docx" du coté utilisateur après qu'il soit généré au niveau du serveur?

Ca... c'est ma réponse précédente : http://codes-sources.commentcamarche.net/forum/affich-10050659-remplir-un-fichier-word-type-avec-des-valeurs-en-post-php#16


Pour que l'utilisateur l'ouvre par la suite de son côté, édite, et upload, toujours dans le formulaire.

ça risque d'être compliqué.....
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015

Merci pour ton aide et ta réactivité Jordane.
Messages postés
6
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
7 juillet 2017

Bonjour,
Très interréssé par cette discussion
J'ai une question sur le template word
Jordane45 écrit

The following table contains a few values that can be edited by the PHPWord_Template class. You just can edit single-line of text elements. The format and the rest of the document stay untouched.

${nomclient}
${adresseFact}

Comment faites vous pour entrer ces zones ?
Si je crée un document template dotx et que je rentre des zones de fusion j'obtiens NOM : «nom»

Pourriez vous me passer le document template ?
[xxxxx@xxxx.xx]

Merci d'avance
Messages postés
28912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 mai 2020
328
Bonjour,
Deux ans plus tard ... tu as de la chance que j'ai conservé un suivi sur cette discussion......
Dans l'idéal tu aurais du créer ta propre discussion (en mettant le lien vers celle là éventuellement dans tes explications...)

Quoi qu'il en soit, de mémoire, on ne créer pas un "champ" mais on écrit simplement ce texte.
http://codes-sources.commentcamarche.net/forum/affich-10050659-remplir-un-fichier-word-type-avec-des-valeurs-en-post-php#11

Ensuite, phpword lit ton document et si il trouve un "texte" correspondant à la valeur cherchée ( dans notre cas ${nomclient} et/ou ${adresseFact} alors il remplace ce "texte" par ce qu'on lui a envoyé )
C'est à ça que sert la fonction
function setValue($search, $replace, $limit=-1) 
de phpword
http://codes-sources.commentcamarche.net/forum/affich-10050659-remplir-un-fichier-word-type-avec-des-valeurs-en-post-php#14
Messages postés
6
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
7 juillet 2017

Je suis nouveau dans ce forum
Merci de ta réponse, tu m'as fait gagner un temps précieux !!