none
Problème de performance automation word 2003 RRS feed

  • Question

  • Bonjour,

    j'ai développé un petit soft sous VisualBasic Express 2008 qui me génére un rapport avec Word 2003 (via l'utilisation du composant .net Interop.word version 8.3.0.0).

    Le rapport contient beaucoup de tableau et fait environ 250pages.

    J'ai malheureusement un gros problème de performance... ça met environ 1h30 pour me générer le fichier word.

    A priori ce ne serais pas la configuration matérielle (Core2DUo, 2Go Ram, ...).

    Pouvez-vous m'aider? Quelqu'un a t il déjà rencontré ce problème? 

    Quelle serait la solution pour que la génération prenne bcp moins de temps ?

     

    Merci.

     

    Thibaut

    jeudi 24 mars 2011 09:47

Réponses

  • Bonjour,

    Une autre piste, c'est de faire le maximum de calcul coté VB (tri, présentation, formatage des données) avant de les envoyer vers Word.

    J'ai un collègue qui a eu le même problème avec Excel et il l'a résolu en faisant ses tris avec VB plutot qu'Excel.

     


    fred
    • Proposé comme réponse TroxsaEditor samedi 26 mars 2011 20:20
    • Marqué comme réponse Alex Petrescu mardi 29 mars 2011 08:43
    vendredi 25 mars 2011 02:22

Toutes les réponses

  • Bonjour,

    Quelques idées, ne sachant pas comment est généré le rapport :

    - Désactiver la mise à jour des affichages (ScreenUpdating)

    - Faire un Clear de l'historique (UndoClear) de temps en temps. Je ne crois pas qu'on puisse le désactiver sous Word.

    - Peut-être éviter le "Late Binding" si c'est le cas (utiliser les types Interop.Word).

    - Peut-être essayer avec un Addin.

    Sinon, il faudrait le code pour voir s'il peut-être optimisé.

    jeudi 24 mars 2011 10:24
  • Bonjour,

    Une autre piste, c'est de faire le maximum de calcul coté VB (tri, présentation, formatage des données) avant de les envoyer vers Word.

    J'ai un collègue qui a eu le même problème avec Excel et il l'a résolu en faisant ses tris avec VB plutot qu'Excel.

     


    fred
    • Proposé comme réponse TroxsaEditor samedi 26 mars 2011 20:20
    • Marqué comme réponse Alex Petrescu mardi 29 mars 2011 08:43
    vendredi 25 mars 2011 02:22
  • Bonjour,

     

    Je suis d'accord avec Fred75, j'ai aussi fait pas mal d'automation et je fait tout ce qui est tri calcul et tout le tralalala en VB quand VB a fini je constitu mon Word

    A bientot


    Cordialement,
    Xavier
    Alias Troxsa My M@iL
    samedi 26 mars 2011 20:22
    Auteur de réponse
  • Bonjour à tous,

     

    Et merci pour vos réponses et idées.

    (Désolé de ne pas vous avoir répondu plus tôt mais j’attendais une notification de réponse par mail mais ca ne marchait pas… j’aurais pu attendre longtemps !)

    Pour amener des éléments de réponse dans l’ordre :

    • désactiver mise à jour de l’affichage : j’avais déjà essayé et ça ralenti encore plus la génération du word …c’est à n’y rien comprendre…
    • nettoyer l’historique : j’essaye (si’ j’y arrive) et vous tiens au courant.
    • A priori que du « early binding » (intellisense, …)
    • Addin ? je ne vois pas comment faire ?
    • je fais aussi une sortie en excel et j’ai aussi le même problème de performance… Dans les 2 cas (word et excel), je ne fais rien faire ni à word (à par de la mise en forme) ni à excel : il s’agit simplement de présenter des tableaux de chiffres. Je vous livre le code ci-dessous et ne vois pas comment en faire faire plus à VB ?
    • Au final, voici le code (et là je suis démasqué, je suis un grand débutant…). En résumé, mon application est un logiciel de calcul et mes sorties word et excel sont pour présenter des résultats de calculs intermédiaires (des grands tableaux de chiffres) :

    J’ai une variable tab_resultat_intermediaire(20, 400, 8) qui contient les résultats intermédiaires (20 tableaux de 400 lignes et 8 colonnes) que je veux simplement recopier dans un tableau dans word (ou excel) sans aucun traitement supplémentaire sur la donnée.

     

    Pour le code word :

    Je crée un tableau. J’inscrit une valeur, puis déplace le curseur à droite, puis une valeur, … jusqu’au bout de la ligne (c’est pas très joli mais je ne sais pas faire autrement ? peut-on adresser directement une ligne et une colonne dans le tableau word ?) :

    (Je suis obligé de redonner la taille du texte à chaque case car je n’arrive pas à demander à word un tableau avec une taille de caractère donné (je veux 10, il me met toujours 12…))

     

    For j = 1 To 20                   

       AppWord.Selection.Tables.Add(rngdoc2, 400, 8)

     

                    With AppWord.Selection

    For i = 1 To 400

                            .Font.Size = taille_du_texte_tableau       

                            .Font.Bold = 1

                            .TypeText(Text:=i)

                            .MoveRight(Unit:=1)

     

                            .Font.Size = taille_du_texte_tableau      

                            .TypeText(Text:=Math.Round(tab_resultat_intermediaire(j, i, 0) / 1000, 2))

                            .MoveRight(Unit:=1)

     

                            .Font.Size = taille_du_texte_tableau       

                            .TypeText(Text:=Math.Round(tab_resultat_intermediaire(j, i, 1) / 1000, 2))  

                            .MoveRight(Unit:=1)

     

                            .Font.Size = taille_du_texte_tableau       

                            .TypeText(Text:=Math.Round(tab_resultat_intermediaire(j, i, 2) / 1000, 2))

                            .MoveRight(Unit:=1)

     

                            .Font.Size = taille_du_texte_tableau       

                            .TypeText(Text:=Math.Round(tab_resultat_intermediaire(j, i, 3) / 1000, 2))  

                            .MoveRight(Unit:=1)

     

    ‘ etc jusqu’à la huitième colonne puis

                           

                           .MoveRight(Unit:=1) ‘pour passer à la ligne d’après

                        Next

     

     

     

    Pour le code excel (environ 25 minutes pour le code ci-dessous) :

     

    For j = 1 To 20                   

    AppExcel.ActiveWorkbook.Worksheets.Add(… ‘je crée un onglet pour chaque tableau

     

    For num_colonne = 0 To 7 

                    For i = 1 To 400  

                        AppExcel.ActiveWorkbook.Worksheets(j).cells(i + 2, num_colonne + 2).value = Math.Round(tab_resultat_intermediaire(j, i, num_colonne) / 1000, 2)

                    Next

                Next

     

    Voila.

    J’ai un peu nettoyé le code avant de la recopier sinon ça aurait été illisible…

     

    A bientôt.

     

    Thibaut

    samedi 2 avril 2011 08:04
  • > Bonjour à tous,
     
    Bonjour,
     
    > * désactiver mise à jour de l’affichage : j’avais déjà essayé et ça ralenti
    > encore plus la génération du word …c’est à n’y rien comprendre…
     
    Curieux en effet.
    Peut-être à réessayer après quelques modifications du code.
     
    > * nettoyer l’historique : j’essaye (si’ j’y arrive) et vous tiens au
    > courant.
     
    De mémoire : UndoClear
    Peut-être pas utile vu ce que tu fais comme modifications.
     
    > * A priori que du « early binding » (intellisense, …)
     
    Oui,
     
    > Je crée un tableau. J’inscrit une valeur, puis déplace le curseur à droite,
    > puis une valeur, … jusqu’au bout de la ligne (c’est pas très joli mais je
    > ne sais pas faire autrement ? peut-on adresser directement une ligne et une
    > colonne dans le tableau word ?) :
    >
    > (Je suis obligé de redonner la taille du texte à chaque case car je
    > n’arrive pas à demander à word un tableau avec une taille de caractère
    > donné (je veux 10, il me met toujours 12…))
     
    Je te propose d'utiliser la collections Rows de l'objet Table.
    Le fait de mettre en forme la première ligne puis d'utiliser Rows.Add
    devrait t'éviter de reproduire la mise à forme pour les lignes
    suivantes, à confirmer.
    Pour chaque ligne, tu peux utiliser Cells pour accéder aux cellules.
     
    Enfin, et surtout pour Excel, j'utiliserais davantage de variables
    intermédiaires. Pour chaque cellule, tu repars de l'objet Application et
    je ne suis pas certain que le code généré soit optimisé.
     
    Les références :
     --
    Fred
    foleide@free.fr
     
    samedi 2 avril 2011 08:50