Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/03/2011, 14h07   #1
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 44
Points : 12
Points : 12
Par défaut Manipulation de fichiers word avec COM

Bonjour,
J'ai besoin de manipuler, en PHP, des fichiers word pour les convertir en PDF après quelques modifications. Je me suis donc rapidement dirigé vers la classe COM.
Cependant un simple copier/coller du 1er exemple de la doc officiel de PHP ne fonctionne pas chez moi...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
/* Démarrage de Word */
$word = new COM("word.application") or die("Impossible d'instancier l'application Word");
echo "Word lancé, version {$word->Version}\n";
 
/* Amener Word devant */
$word->Visible = 1;
 
/* Cree un document vide */
$word->Documents->Add();
 
/* Quelques commandes */
$word->Selection->TypeText("Ceci est un test...");
$word->Documents[1]->SaveAs("test.doc");
 
/* Fermeture de word */
$word->Quit();
 
/* Libération des ressources */
$word = null;
?>
Ce code m'envoie l'erreur suivante :

Code :
Fatal error: Call to undefined method variant::SaveAs()
J'ai recherché une solution sur internet pendant plusieurs heures. La plupart sans aucune réponse, les autres n'ont rien de concluant. Certains ont même dit que le problème été résolu... sans annoncer la solution

Pour résumer ce que j'ai trouvé:
* Certains disaient d'utiliser
Code :
$word->ActiveDocuments->SaveAs("test.doc");
au lieu de
Code :
$word->Documents[1]->SaveAs("test.doc");
Mais le résultat est le même.

* D'autres affirme qu'un tableau commence à l'indice 0, donc d'utiliser
Code :
$word->Documents[0]->SaveAs("test.doc");
Mais rien n'existe à cet index du tableau.
Code :
1
2
Fatal error: Uncaught exception 'com_exception' with message 'Source: Microsoft Word
Description: Le membre de la collection requis n'existe pas.'
* Un dernier affirmait qu'il s'agit d'une collection et pas d'un tableau, donc qu'il faut écrire le code suivant :
Code :
$word->Documents(1)->SaveAs("test.doc");
Ce qui donne toujours la même erreur qu'au debut...


Avez-vous une idée?

Merci d'avance.
Schpountz42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h34   #2
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Es-tu en PHP4 ?

Je cite la doc :
Citation:
À partir de PHP 5, PHP détectera automatiquement les méthodes qui acceptent les paramètres par référence, et convertira automatiquement les variables PHP classiques en une forme pouvant être passée par référence. Cela signifie que vous pouvez appeler les méthodes de façon naturelle ; vous n'avez pas d'efforts supplémentaires à faire dans votre code.

En PHP 4, pour passer les paramètres par référence, vous devez créer une instance de VARIANT la classe pour utiliser les paramètres par référence.
En regardant la doc de VARIANT, on tombe sur cet exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
$empty = new VARIANT(); // on instancie un objet VARIANT
com_load_typelib('Word.Application');
$word = new COM('word.application') or die('Unable to load Word');
$word->Documents->Open('C:/Unfilled.DOC'); // On charge le fichier doc
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // LA ligne importante ici
$word->Selection->TypeText($_GET['YourName']); // Tu entres ton texte dans la page
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc"); // Tu save
$word->Quit();
$word->Release();
$word = null;
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h37   #3
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 44
Points : 12
Points : 12
Je suis sous PHP 5.3.5, bref le dernier WampServer
Schpountz42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h56   #4
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 44
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 44
Points : 12
Points : 12
Je viens de trouver un site anglais
http://www.codeguru.com/forum/showthread.php?t=483821

Dont l'avant dernier post donne une solution :
Citation:
Problem SOVLED.

I was not able to understand why the same code was right on windows XP and was bad in Windows 7.

Now I've discovered the reason of the "Fatal error: Call to undefined method variant::SaveAs()" error: the problem resides on the WINWORD's process owner.

Apache (in windows 7) was running on the "SYSTEM" user (check it on the service list) and I had opened the WINWORD only with the user "VDARIO" before (the login user). On the first opening of WINWORD, you must digit your credential, and I didn't it (obviously) with the SYSTEM user.

The solution resides on changing the user of Apache2 on the "connection" tab in the service list, switching it to the login user.

Bye,
Dario
J'ai bêtement fait ce qu'il dit, je suis donc aller dans la liste des services "services.msc", propriété de mon service "wampapache", onglet "connexion", puis indiquer mon login windows...
Apparement, ca fonctionne!
Cependant, je comprend pas du tout pourquoi il est nécessaire d'effectuer ce changement de connexion du service apache.
Vous savez pourquoi?
Schpountz42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h27.


 
 
 
 
Partenaires

Hébergement Web