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

Windows Forms Discussion :

[C#]Créer un document Word


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut [C#]Créer un document Word
    Bonjour,

    Voilà, je suis en train d'essayer de créer un doc' Word à partir d'un Windows Form, j'ai trouvé ici http://jab.developpez.com/tutoriels/dotnet/word/#L7 tout ce qu'il me faut.

    Pour l'instant, je n'ai mis que ce code là :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    private void button1_Click(object sender, EventArgs e)
    {
     
        // Connexion à Word
        Microsoft.Office.Interop.Word.Application msWord = new Microsoft.Office.Interop.Word.Application();
        msWord.Visible = false; // Mettez cette variable à true si vous souhaitez visualiser les opérations.
        object missing = System.Reflection.Missing.Value;
     
        // Attribuer le nom
        object fileName = @"Mon nouveau document.doc";
     
        Microsoft.Office.Interop.Word.Document nvDoc;
     
        if (System.IO.File.Exists((string)fileName))
        {
            // ouvrir le document existant
            nvDoc = msWord.Documents.Open(ref fileName, ref missing, ref missing,
                                ref missing, ref missing, ref missing,
                                ref missing, ref missing, ref missing,
                                ref missing, ref missing, ref missing,
                                ref missing, ref missing, ref missing,
                                ref missing);
        }
        else
        {
            // Choisir le template
            object templateName = @"Mon Template.dot";
            // Créer le document
            nvDoc = msWord.Documents.Add(ref templateName, ref missing, ref missing, ref missing);
            // Sauver le document
            nvDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing,
                        ref missing, ref missing, ref missing, ref missing, ref missing,
                        ref missing, ref missing, ref missing, ref missing, ref missing,
                        ref missing);
        }
    }
    Je lance l'appli' et clique sur le bouton mis en place.

    Ca me sort une exception sur cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nvDoc = msWord.Documents.Add(ref templateName, ref missing, ref missing, ref missing);
    Et l'exception est :
    "L'exception COMException n'a pas été gérée".
    "Word n'a pas pu lire ce document. Il est peut-être corrompu."

    Ca me dit d'essayer d'ouvrir le fichier pour le réparer, mais comme il n'a pas pu le créer forcément il ne le trouve pas.

    Help please

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Tes variables fileName et templateName doivent contenir le chemin complet du fichier.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object fileName = @"C:\Mon Répertoire\Mon nouveau document.doc";
    object templateName = @"C:\Un autre Répertoire\Mon Template.dot";

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Merci de ta réponse, mais ça ne marche pas...

    J'ai exactement le même problème même après avoir rajouté le chemin complet.

    Cependant, quelque chose m'intrigue :
    Le template utilisé se trouve dans le répertoire des templates de Word et non avec l'application. Il vous est toujours possible de spécifier un chemin différent. De même, sans indication contraire le document est sauvé dans le répertoire spécifié dans Word.
    Citation provenant d'ici : http://jab.developpez.com/tutoriels/dotnet/word/#L7

    Donc logiquement il ne devrait pas y avoir besoin de spécifier le chemin précis si il s'enregistre dans Word si on ne précise pas de chemin.

    J'ai donc essayé en mettant uniquement le chemin dans ma variable fileName, mais rien n'y fait...

    Paumé complet !

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    J'ai utilisé le meme lien que toi et chez moi ca marche nikel.
    J'ai juste ajouté la reference Word a mon projet.
    Voici mon code si ca peut t'aider:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
            public void CreateDoc() 
     
            {
                string sPathSaveFacture = string.Empty;
     
                    Microsoft.Office.Interop.Word.Application msWord = new Microsoft.Office.Interop.Word.Application();
     
                        msWord.Visible = false;
     
                    object missing = System.Reflection.Missing.Value;
                    string sDateFile = dateFacture.Text.Replace("/", "_");
                    // Attribuer le nom
                    object fileName = string.Empty;
                    sPathSaveF = Environment.CurrentDirectory + "\\Content\\" + DateTime.Now.Year.ToString();
     
                    object pwd = "ABC";
     
     
     
                    fileName = @sPathSaveFacture + "\\" +"F_" + sDateFile + ".doc";
     
     
                    Microsoft.Office.Interop.Word.Document nvDoc;
                    if (File.Exists((string)fileName))
                    {
                        // ouvrir le document existant
                        nvDoc = msWord.Documents.Open(ref fileName, ref missing, ref missing,
                                    ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing,
                                    ref missing);
     
                        try
                        {
                       //     nvDoc.Unprotect(ref pwd);
                        }
                        catch {}
                    }
                    else
                    {
     
                        // Choisir le template
                        object templateName = "";
     
                        switch (NumRelance)
                        {
                            case 0: templateName = Environment.CurrentDirectory + "\\Content\\"+sModelCourierTypeF ; break;
                            case 1: templateName = Environment.CurrentDirectory + "\\Content\\"+sModelCourierTypeR1 ; break;
                            case 2: templateName = Environment.CurrentDirectory + "\\Content\\"+sModelCourierTypeR2 ;break;
                            case 3: templateName = Environment.CurrentDirectory + "\\Content\\"+sModelCourierTypeR3; break;
     
                            default: templateName = Environment.CurrentDirectory + "\\Content\\"+sModelCourierTypeF;break; 
                        }
     
                        // Créer le document
                        nvDoc = msWord.Documents.Add(ref templateName, ref missing, ref missing, ref missing);
                    }

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Alors ce doit être le template qui est incorrect.
    Essaye d'ouvrir ce fichier .dot directement sous Word, tu devrais avoir le même message d'erreur.

    Profite-en pour tuer tous les processus WINWORD.EXE qui trainent éventuellement dans ton gestionnaire de tâches.

  6. #6
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Je sais pourquoi il me génère une exception, c'est parce que peu importe le chemin que je lui indique, il ne trouve pas de Mon template.dot vu qu'il n'existe pas.

    Je pensais que ça allait le créer en même temps que le .doc mais apparemment ça n'est pas le cas.

    Par contre, en indiquant dans mon code un template de Word existant (SUPPORT.dot se trouvant dans C:\Program Files\Microsoft Office\OFFICE11\MACROS sous Office 2003), j'ai un .doc qui a bien été généré, mais avec les données du .dot, et ce n'est donc pas ce qui m'interresse.

    Il faudrait donc que je crée un template ?

    J'y comprends plus rien là...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    ben forcement oui faut creer un template...
    Si tu lui demande de creer "MonDoc.doc" en te basant sur un doc qui EXISTE PAS, il va avoir du mal.
    Ce que tu peux faire c'est de creer un doc en indiquant le Normal.dot qui est le modele par defaut de Word.

  8. #8
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ouais ce que tu me dis marche skunkies, mais si j'ai plusieurs .doc a créer et que j'utilise à chaque fois Normal.dot, ça va pas me donner tout le temps le même .doc ?

    Pis une autre question pour toi skunkies, en regardant ton code j'ai vu que t'as pas mis de nom de ficher dans ta variable templateName, ça génère quand même ton .doc ?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Ouais ce que tu me dis marche skunkies, mais si j'ai plusieurs .doc a créer et que j'utilise à chaque fois Normal.dot, ça va pas me donner tout le temps le même .doc ?
    Je ne comprends pas vraiment ta question ou ton besoin.
    Peux tu nous dire ce que tu essayes de faire precisement stp.

    Citation Envoyé par DarkSeiryu Voir le message
    Pis une autre question pour toi skunkies, en regardant ton code j'ai vu que t'as pas mis de nom de ficher dans ta variable templateName, ça génère quand même ton .doc ?
    Si elle est valorisée dans mon switch/case.J'ai plusieurs template et en fonction de ce que je recupere lorsque j'appel ma fonction je valorise ma variable templateName avec le bon template.

  10. #10
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ouais je précise.

    J'suis en train de développer une application permettant de réaliser des fiches en .doc, et cette appli' va finir dans beaucoup d'ordinateur (300 à 400) donc beaucoup de personnes vont s'en servir et chaque personne aura à s'en servir plusieurs fois.

    Je voulais donc savoir si, quand je modifie le .doc, ça modifie aussi le .dot car si j'me sers toujours du même .dot et qu'il est modifié une fois, ça voudrait dire qu'à chaque fois j'aurais la même fiche générée (car les fiches ne contiendront pas les même informations, elles différeront, même si c'est que d'une phrase).

    J'sais pas si c'est tout bien clair pour les lecteurs ^o)

    Si t'as besoin d'autres précisions n'hésite pas.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    si j'ai bien compris, tu vas avoir une form qui en appuyant sur un bouton va generer un .doc.
    Est ce bien cela.
    Le but du .dot c'est de fournir un modele (template) pour que lorsque tu vas appuyer sur ton bonton tu va pouvoir dire tel champ de mon formulaire va aller dans tel champ de mon document.
    Et non, tu ne modifies en aucun cas ton .dot lorsque tu modifie ton .doc.
    Je ne sais pas si c'est clair pour toi.
    Bon courage

  12. #12
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ouais c'est bon tu m'as bien éclairé merci ^^

    J'peux donc me servir partout du Normal.dot sans souci, c'est ce qu'il me fallait merci bien !

    Et oui j'ai un bouton qui va me servir à générer le .doc une fois que toutes les informations requises auront été écrites ou importées (si ce sont des images) sur mon application.

    Merci encore !

    (Je ne clos pas le sujet, il est possible que je revienne plus tard pour d'autres questions...)

Discussions similaires

  1. [Visual C# Express] Créer un document Word?
    Par @drien dans le forum Windows Forms
    Réponses: 6
    Dernier message: 19/08/2010, 11h18
  2. Créer un document Word avec Flex
    Par trotters213 dans le forum Flex
    Réponses: 3
    Dernier message: 15/05/2008, 10h07
  3. [Word] Récupérer résultat Mysql pour créer un document word
    Par fat dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/06/2007, 16h59
  4. Comment créer un document Word avec C++ Builder ?
    Par motte82 dans le forum C++Builder
    Réponses: 14
    Dernier message: 23/07/2006, 11h07
  5. [VB6]Créer un document word
    Par zemeilleurofgreg dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2006, 20h42

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