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

Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
- - Dernière réponse : christianr06
Messages postés
6
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
7 juillet 2017
- 4 juil. 2017 à 17:26
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?
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364
1
Merci
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;
				}			
			}
		}
	}


Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 139 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45
Messages postés
132
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
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
Commenter la réponse de cs_eli42
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364
0
Merci
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 .... ??
Commenter la réponse de jordane45
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci
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.
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 -
... 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 !
Commenter la réponse de Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci
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.
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 -
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.
Commenter la réponse de Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci
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!!
Commenter la réponse de Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci
jordanee45 voici l'affichage après le submit et le docx généré:
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 -
Peux-tu nous faire une capture écran de ton fichier template Template.docx ?
Commenter la réponse de Tl_IT
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364
0
Merci
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}


Commenter la réponse de jordane45
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci
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:
Tl_IT
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.
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 -
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.
Commenter la réponse de Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci
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.
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 -

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
Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
> jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
-
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.... ?
Commenter la réponse de Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
0
Merci


Merci pour ton retour.
Tl_IT
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é.
Tl_IT
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;
Tl_IT
Messages postés
23
Date d'inscription
jeudi 4 juin 2015
Statut
Membre
Dernière intervention
9 juin 2015
-
Aidez-moi svp!!
Commenter la réponse de Tl_IT
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364
0
Merci
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 !


Tl_IT
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.
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 > Tl_IT
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é.....
Tl_IT
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.
Commenter la réponse de jordane45
Messages postés
6
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
7 juillet 2017
0
Merci
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
jordane45
Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
364 -
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
christianr06
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 !!
Commenter la réponse de christianr06

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.