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

C# Discussion :

Fermer word proprement, mission impossbile?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut Fermer word proprement, mission impossbile?
    Bonjour,

    Je n'arrive pas à fermer word proprement, lors de la génération des 1000 documents sur mon serveur, je trouve tous les winword qui ne sont pas fermés, est ce qu'il y a un moyen de fermer ces processus, car je ne comprends pas pourquoi ils sont toujours ouvert, merci infiniment de votre aide.
    NB : j'ai un warning aux lignes 37 et 38 :
    Ambiguity between method 'Microsoft.Office.Interop.Word._Document.Close(ref object, ref object, ref object)' and non-method 'Microsoft.Office.Interop.Word.DocumentEvents2_Event.Close
    Est ce que c'est l'origine de mon problème?

    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
     
     public void FUSION(string s)
            {
     
                    Console.Write("1");
     
                    String[] tbStr2 = s.Split(new Char[] { ';' });
                    string nb = tbStr2[0];
                    Object oMissing = System.Reflection.Missing.Value;
                    Object oTrue = true;
                    Object oFalse = false;
                    Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
                    Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
                    oWord.Visible = true;
                    oWord.Visible = false;
                    Object oTemplatePath = modelee;
                    oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
                    bool sympb = false; bool E = false; bool n = false; bool p = false; bool r = false;
     
    foreach (Microsoft.Office.Interop.Word.Range range in oWordDoc.Words)
                    {if (range.Text.Trim().Contains("$"))
                        {   int pos = range.Text.Trim().IndexOf("$");
                            string str = range.Text.Trim().Replace("$", "");
                            range.Text = str;} }
     
                    foreach (Microsoft.Office.Interop.Word.Range range in oWordDoc.Words)
                    {if (range.Text.Trim().Contains("$$"))
                        {   int pos = range.Text.Trim().IndexOf("$$");
                            string str = range.Text.Trim().Replace("$$", "");
                            range.Text = str;} }
     
                    Object oSaveAsFile ="./1.doc";
                    oWordDoc.SaveAs(ref oSaveAsFile, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);
                    oWordDoc.Close(ref oFalse, ref  oMissing, ref oMissing);
                    oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
     
     
     
     
            }

  2. #2
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Je pense qu'appeler le méthode FUSION en masse est risqué car tu ouvres et ferme word à chaque appel.
    Le mieux serait de créer une seule instance Microsoft.Office.Interop.Word.Application avec de multiple document que tu ouvres et ferme dans FUSION. En suite du oWord.Quit dans la méthode appelante une fois.
    Mais j'avoue qu'avec une architecture web derrière ce n'ai pas évident voir, word n'est pas conçu pour ça.
    Sinon pour générer des document office :
    http://www.microsoft.com/downloads/e...DisplayLang=en

    ou mieux encore (mais pas testé)

    http://flexdoc.codeplex.com/

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Comment peut on concaténer les document word, je m'explique, au lieu de faire 1000 créations, on fait un seule document de 1000 pages (chaque document est sur une seule page) puis on enregistre uniquement un seule document au lieu de 1000, merci infiniment.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Bonjour,

    Très diffcilement, j'ai réussi à trouver comment terminer les processus winword.exe, ci dessous le code que j'ai rajouté à la fin de FUSION :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordDoc);
    oWordDoc = null; oWord = null;
     
    GC.Collect();
    GC.WaitForPendingFinalizers();
     
    GC.Collect();
    GC.WaitForPendingFinalizers();
    cependant la génération devient très lente, pour la suppression de 63 processus, ça prend dans les 2min, comment peut on optimiser? merci infiniment.

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Bonjour sinon j'ai une solution je laisse les critique décider de sa perspicacité

    -1 Tu déclares un public static ArrayList conteneur_word dans ta classe Program.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static ArrayList msw_Objects = new ArrayList();
    -2 Dans le constructeur de ta classe qui maipule Word tu ajoutes chaque nouvel objet à ce conteneur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Microsoft_Word(bool show)//,ArrayList msw_Ob)
    {
    //initialisation etc.....
    oWord = new Microsoft.Office.Interop.Word.Application();
    Program.msw_Objects.Add(oWord);
    }
    -3 Dans le destructeur de ta classe tu mets une boucle sur ce objet et tu leur demande de se fermer. Ca tue le processus.
    Moi j'ai laissé la propriété enableWarning qui prévient l'utilisateur que le doc veut se fermer mais toi qui utilise ca coté serveur tu peux la désactiver.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ~Microsoft_Word()
    {
    for (int i = 0; i < Program.msw_Objects.Count; i++)
    {
        Microsoft.Office.Interop.Word._Application oWord = (Microsoft.Office.Interop.Word._Application)Program.msw_Objects[i];
        oWord.Quit();
     
    }
    Program.msw_Objects.Clear();
    		}

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Peut être que ta solution est la meilleur, sauf que parfois je réalise la génération de plus de 4000 fichiers word, j'ai pas envi de terminer les processus à la fin du traitement (destructeur), car le serveur devient trop trop long, merci d'avance de votre aide.

Discussions similaires

  1. [WD-MAC 2004] Impossible de fermer word
    Par Iris17 dans le forum Word
    Réponses: 1
    Dernier message: 09/02/2012, 01h08
  2. Fermer word après aperçu
    Par exile69 dans le forum C#
    Réponses: 3
    Dernier message: 26/05/2009, 18h46
  3. Comment fermer Excel proprement
    Par RJDTGA dans le forum VBA Access
    Réponses: 11
    Dernier message: 20/03/2009, 11h57
  4. Fermer fenêtre proprement ?
    Par eSbii dans le forum GLUT
    Réponses: 0
    Dernier message: 14/03/2008, 23h06
  5. Fermer Word proprement depuis excel
    Par Australia dans le forum VBA Word
    Réponses: 5
    Dernier message: 21/11/2006, 09h37

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