IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Manipulation de fichiers word avec COM


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 22
    Points
    22
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $word->ActiveDocuments->SaveAs("test.doc");
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $word->Documents[0]->SaveAs("test.doc");
    Mais rien n'existe à cet index du tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Es-tu en PHP4 ?

    Je cite la doc :
    À 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    Je suis fervent 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 de développeur web dans le Val d'Oise mais aussi plusieurs projets personnels.
    Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, une extension de navigateur 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…

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 22
    Points
    22
    Par défaut
    Je suis sous PHP 5.3.5, bref le dernier WampServer

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 22
    Points
    22
    Par défaut
    Je viens de trouver un site anglais
    http://www.codeguru.com/forum/showthread.php?t=483821

    Dont l'avant dernier post donne une solution :
    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?

Discussions similaires

  1. Utiliser un fichier Word avec une application Windev.
    Par Belgarath4 dans le forum WinDev
    Réponses: 7
    Dernier message: 18/07/2007, 17h04
  2. Modifier un fichier word avec Delphi
    Par Andry dans le forum Delphi
    Réponses: 5
    Dernier message: 10/07/2007, 16h56
  3. Manipulation de fichiers WORD/RTB : Faisabilité
    Par mister3957 dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 10/03/2007, 03h28
  4. Manipuler un fichier excel avec python
    Par dipajero dans le forum Général Python
    Réponses: 4
    Dernier message: 09/02/2006, 23h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo