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

Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 5 juin 2015 à 22:57 - Dernière réponse : christianr06 6 Messages postés mardi 4 juillet 2017Date d'inscription 7 juillet 2017 Dernière intervention
- 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 

28 réponses

Répondre au sujet
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 juin 2015 à 15:07
+1
Utile
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;
				}			
			}
		}
	}


Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de jordane45
cs_eli42 106 Messages postés mardi 24 décembre 2002Date d'inscription 8 avril 2018 Dernière intervention - Modifié par jordane45 le 6/06/2015 à 18:11
0
Utile
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
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 6 juin 2015 à 18:13
0
Utile
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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 7 juin 2015 à 11:04
0
Utile
1
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 7 juin 2015 à 19:19
... 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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 7 juin 2015 à 21:59
0
Utile
1
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 juin 2015 à 10:28
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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 8 juin 2015 à 10:48
0
Utile
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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 8 juin 2015 à 10:54
0
Utile
1
jordanee45 voici l'affichage après le submit et le docx généré:
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 juin 2015 à 11:08
Peux-tu nous faire une capture écran de ton fichier template Template.docx ?
Commenter la réponse de Tl_IT
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 juin 2015 à 11:49
0
Utile
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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 8 juin 2015 à 12:12
0
Utile
2
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 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 8 juin 2015 à 12:25
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 juin 2015 à 15:02
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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - Modifié par Tl_IT le 8/06/2015 à 16:34
0
Utile
2
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 juin 2015 à 16:42

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 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention > jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juin 2015 à 11:50
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
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 11:51
0
Utile
3


Merci pour ton retour.
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 11:56
Je crois que dans la librairie PHPWord, il n'y a pas comment ouvrir un fichier word fraichement généré.
Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 12:56
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 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 13:10
Aidez-moi svp!!
Commenter la réponse de Tl_IT
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juin 2015 à 13:56
0
Utile
3
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 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 14:09
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention > Tl_IT 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 14:47

, 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 23 Messages postés jeudi 4 juin 2015Date d'inscription 9 juin 2015 Dernière intervention - 9 juin 2015 à 15:40
Merci pour ton aide et ta réactivité Jordane.
Commenter la réponse de jordane45
christianr06 6 Messages postés mardi 4 juillet 2017Date d'inscription 7 juillet 2017 Dernière intervention - Modifié par jordane45 le 4/07/2017 à 15:11
0
Utile
2
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 4 juil. 2017 à 15:25
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 6 Messages postés mardi 4 juillet 2017Date d'inscription 7 juillet 2017 Dernière intervention - 4 juil. 2017 à 17:26
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.