Thread avec application Word

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 21 janv. 2016 à 20:05
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 23 janv. 2016 à 13:38
Bonsoir le forum,

Avec VB 2010 Express, je créé des fichiers de consignes (word docx) à partir de plusieurs templates.
         ' Création des fichiers de Consignes
        Call CreateMOP(customer)

   '#####################################################################################
    '# Consignes : création des fichiers de Consignes
    '#####################################################################################
    Private Sub CreateMOP(ByVal customer As String)
        richtextboxlogscript.AppendText(dt(currentdate) & "Création des fichiers de Consignes")
        Call UpdateDataGridViewPDP(1, 2, Color.Cyan, New String(" "c, 2) & "En cours ( " & "1" & " / " & fileword.Count & " )", False)

        ' Déclaration des variables
        Dim pathinfile As String = pathroot & customer & pathconsigne
        Dim pathoutfile As String = pathroot & customer & pathsaveconsigne
        Dim countwordfile As Integer = 0

        For Each item In fileword ' fileword As New List(Of ListFileWord)
            ' Déclaration des variables
            Dim WordApp As Word.Application = New Word.Application()
            Dim WordDoc As New Word.Document
            Dim infile As String = item.FileWord
            Dim file As String = infile.Substring(infile.LastIndexOf("\") + 1)
            Dim filetrame As String = item.FileTrame
            Dim trame As String = filetrame.Substring(filetrame.LastIndexOf("\") + 1)
            Dim startparam As Integer = 14

            ' Ouverture Application Word
            WordApp.Visible = False
            WordApp.DisplayAlerts = CType(False, Microsoft.Office.Interop.Word.WdAlertLevel)
            WordApp.ScreenUpdating = False

            ' Ouverture du Template Trame de Consignes
            WordDoc = WordApp.Documents.Open(CType(item.FileTrame, Object), , True, , , , , , , , , False)
            System.Windows.Forms.Application.DoEvents()

            ' Mise à jour des champs CustomDocumentProperties du document Word 
            WordDoc.CustomDocumentProperties.Item(11) = item.Contract
            WordDoc.CustomDocumentProperties.Item(12) = item.Codebien
            WordDoc.CustomDocumentProperties.Item(13) = item.Category

            For w As Integer = 0 To item.Parameters.Count - 1
                WordDoc.CustomDocumentProperties.Item(startparam) = item.Parameters.Item(w)
                On Error Resume Next
                startparam += 1
            Next

            System.Windows.Forms.Application.DoEvents()
            ' Mise à jour des propriétés du document Word
            WordDoc.Fields.Update()
            System.Windows.Forms.Application.DoEvents()
            WordDoc.Application.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone
            ' Sauvegarde de la Consigne
            WordDoc.SaveAs(FileName:=CType(item.FileWord, Object))
            System.Windows.Forms.Application.DoEvents()
            WordDoc.Close(SaveChanges:=False)
            System.Windows.Forms.Application.DoEvents()

            ' Fermeture Word
            WordApp.Application.DisplayAlerts = CType(True, Microsoft.Office.Interop.Word.WdAlertLevel)
            WordApp.Application.ScreenUpdating = True
            WordApp.Quit()
            WordApp = Nothing

            datagridviewfilescgn.Rows(countwordfile).Cells(3).Value = New String(" "c, 3) & "Consigne créée"
            datagridviewfilescgn.Item(3, countwordfile).Style.BackColor = Color.Lime
            Me.Refresh()
            System.Windows.Forms.Application.DoEvents()

            Thread.Sleep(3000) ' attente pour fermeture de Word

            countwordfile += 1
        Next
        Call UpdateDataGridViewPDP(1, 2, Color.Lime, New String(" "c, 2) & "Terminé", False)
    End Sub
L'appli est publiée sur un serveur distant (Londres), et de part plusieurs proxy, l'ouverture de Word prend environ 2-3' !!!
Dans un statustrip, j'ai plusieurs labels indiquant l'heure (HH:mm:ss) actuelle, la durée du script ...
Ces labels freezent à chaque création d'un fichier de consigne.

Question :
Est-il possible d'exécuter la sub "CreateMOP" dans un thread ?

Merci pour vos réponses.

2 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 janv. 2016 à 20:25
Bonsoir,

il est possible de faire "n'importe quoi" dans un Thread.
Tu peux regarder le backgroundworker.

Tu peux aussi générer le docx sans ouvrir word, voir
https://docx.codeplex.com par exemple.

Vb.Net n'est pas ma spé, mais je ne pense pas que le call soit encore utile.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
21 janv. 2016 à 20:47
Bonsoir Whismeril,

Merci pour tes liens indiqués.
Je vais potasser le composant BackgroundWorker.

Pour le call, oui il n'est pas indispensable, mais c'est ma nostalgie du vbs.
Cela permet de "voir" qu'on appelle une sub ou function.

Bonne soirée,
jean-marc
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
23 janv. 2016 à 10:33
Bonjour le forum,

Bonjour Whismeril,

J'ai donc utilisé le composant backgroundworker.
Cela m'a contraint d'utiliser, pour la 1ère fois, les délégués pour mes autres contrôles.

Pour ton lien sur le docx, j'ouvrirai un nouveau post car je n'ai pas trouvé de correspondance en .Net

Merci Whismeril de tes précieux conseils, et bon week-end.

jean-marc
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
23 janv. 2016 à 13:38
Bonjour,

Pour ton lien sur le docx, j'ouvrirai un nouveau post car je n'ai pas trouvé de correspondance en .Net
heu... c'est une librairie open sources, écrite en C# donc en .Net, que tu peux utiliser compilée (ce que j'ai fait) ou reprendre le code pour toi.

Il existe de bons traducteurs en ligne vers VB.Net.

Par contre il y a peu de docs et de tuto et ils sont en anglais.

Un jour si j'ai du temps, je ferai un petit tuto dessus.
0
Rejoignez-nous