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

VB.NET Discussion :

Word Automation : compléter la ligne après coup


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut Word Automation : compléter la ligne après coup
    Bonjour,

    je cherche à rédiger un document Word via un script, j'arrive à gérer l'ouverture, la fermeture et l'enregistrement. L'ajout de texte me pose quelques difficultés :

    Je souhaite créer des lignes dans la première partie est en gras et la seconde en standard : Date : 22/02/2013

    Je n'arrive pas à rajouter la date sans que cela ne supprime le "Date :"

    Autre soucis, l'alignement : Soit tout est centré, soit rien...

    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
            'Titre du Rapport
            oTitre = docWord.Content.Paragraphs.Add
            oTitre.Range.Text = "Rapport intervention"
            oTitre.Range.Font.Size = 24
            oTitre.Range.Font.Bold = True
            oTitre.Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            oTitre.Format.SpaceAfter = 24    '24 pt spacing after paragraph.
            oTitre.Range.InsertParagraphAfter()
     
            'Date
            oInfo1 = docWord.Content.Paragraphs.Add(docWord.Bookmarks.Item("\endofdoc").Range)
            oInfo1.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            oInfo1.Range.Font.Size = 12
            oInfo1.Range.Font.Bold = True
            oInfo1.Range.Text = "Etabli le : "
     
            oInfo1 = docWord.Content.Paragraphs.Add(docWord.Bookmarks.Item("\endofdoc").Range)
            oInfo1.Range.Font.Bold = False
            oInfo1.Range.Text = Format(Now, "dd/MM/yyyy")
     
            oInfo1.Format.SpaceAfter = 12
            oInfo1.Range.InsertParagraphAfter()
    J'ai cherché du coté des "Bookmarks.Item" pour mettre à la suite mais rien n'y fait. Est-ce que le fait d'utiliser la même variable change quelque chose ?

    Merci d'avance pour vos conseils.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Hello,

    Je ne sais pas exactement dans quel context tu fais ceci donc je vais t'indiquer trois méthodes du moche à l'élégant pour la génération de document word.

    1. Utiliser une macro sous word pour transformer une génération de document word à la main (ou plutôt au souris-clavier) en du code VBA. Convertir le code VBA en .Net (sachant que le modèle objet représentant le document est le même ce n'est pas trop compliqué) avec d'éventuels adaptations pour placer ses variables à la place de valeurs fixes.

    Ce genre de combine compliquera considérablement les éventuelles modifications à apporter. Il est nécessaire d'avoir Word installé sur la machine. Ne convient pas pour une utilisation de type serveur.

    A savoir que VBA est plus rapide que l'automation Word .Net. A voir si c'est pas simple de faire un développement VBA directement.

    2. Faire un document word template avec des bookmarks aux endroits stratégique ou du texte doit être remplacé par une variable. En automation, il est assez simple d'effectuer le remplacement de ces bookmarks par les valeurs provenant des variables.

    Sauf erreur de ma part, le bookmarks est détruits pendant l'opération, il faut donc toujours partir d'une copie d'un template et ne pas prévoir une fonctionnalités d'update de document. Il est nécessaire d'avoir Word installé sur la machine. Ne convient pas pour une utilisation de type serveur.

    3. Utiliser le openxml SDK, on ne travaille alors plus au niveau de Word mais au niveau du code xml du documents.

    Il n'est pas nécessaire d'avoir Word installé sur la machine. Convient pour une utilisation de type serveur (c'est même prévu pour). Génère que des .docx et non pas de .doc. Technologie relativement réçente, la recherche de documentation pour se former peut s'avérer ardue.

  3. #3
    Membre averti
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Points : 391
    Points
    391
    Par défaut
    Bonjour,

    Pour la partie "date" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            oInfo1 = docWord.Content.Paragraphs.Add(docWord.Bookmarks.Item("\endofdoc").Range)
            oInfo1.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft
            oInfo1.Range.Font.Size = 12
            oInfo1.Range.Font.Bold = False
            oInfo1.Range.Text = "Etabli le : "
            Dim pos1 As Integer = docWord.Range.Start
            Dim pos2 As Integer = oInfo1.Range.End - 1
            oInfo1.Range.InsertAfter(Format(Now, "dd/MM/yyyy"))
            oInfo1.Format.SpaceAfter = 12
            oInfo1.Range.InsertParagraphAfter()
            docWord.Range(pos1, pos1 + pos2).Font.Bold = True
    En mode lecture/écriture.

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    D'abord, merci pour le bout de code bien pratique et qui répond bien à ce que je cherche.

    Concernant le mode d'édition, je suis un peu obligé de passer par là car il s'agit d'une distribution à faire sur des PC nomade. Le logiciel permet d'analysé des données machine puis d'en tirer un rapport de fonctionnement. Il y aura derrière une impression PDF.

    J'ai presque tout compris le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'on génère le texte
    oInfo1.Range.Text = "Etabli le : "
    'déclaration de postions
    Dim pos1 As Integer = docWord.Range.Start
    Dim pos2 As Integer = oInfo1.Range.End - 1
    'rajout de texte
    oInfo1.Range.InsertAfter(Format(Now, "dd/MM/yyyy"))
    'Insertion dans le .doc
    oInfo1.Format.SpaceAfter = 12
    oInfo1.Range.InsertParagraphAfter()
    Par contre je comprend moins la ligne suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docWord.Range(pos1, pos1 + pos2).Font.Bold = True
    J'ai l'impression qu'on passe le Bold en False au début puis qu'on ré-intervient sur la chaîne après coup en passant le Bold en True sur le début. Mais le "pos1 + pos2" ? Késako ?

    EDIT > en fait Range(pos1, pos1 + pos2) ce sont les limites ? pos1 correspond au début de la chaine et "pos1+pos2" à la fin de la première partie ?

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Le code marche nickel si on n'a besoin que d'une ligne de ce type . S'il en faut plusieurs à la suite, il met tout en gras.

    J'ai adapté le code, il mémorise la fin de la chaine précédante :

    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
            'Titre du Rapport
            oTitre = docWord.Content.Paragraphs.Add
            oTitre.Range.Text = "Rapport intervention"
            oTitre.Range.Font.Size = 24
            oTitre.Range.Font.Bold = True
            oTitre.Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            oTitre.Format.SpaceAfter = 24    '24 pt spacing after paragraph.
            oTitre.Range.InsertParagraphAfter()
            pos1 = oTitre.Range.End - 1
     
            'Date
            oDate = docWord.Content.Paragraphs.Add(docWord.Bookmarks.Item("\endofdoc").Range)
            oDate.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft
            oDate.Range.Font.Size = 12
            oDate.Range.Font.Bold = False
            oDate.Range.Text = "Etabli le : "
            'pos1 = oDate.Range.Start
            pos2 = oDate.Range.End - 1
            oDate.Range.InsertAfter(Format(Now, "dd/MM/yyyy"))
            oDate.Format.SpaceAfter = 12
            oDate.Range.InsertParagraphAfter()
            docWord.Range(pos1, pos2).Font.Bold = True
            pos1 = oDate.Range.End - 1
    Par contre, je n'ai toujours pas trouvé comment centrer le titre et non pas l'intégralité du document... je cherche

  6. #6
    Membre averti
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Points : 391
    Points
    391
    Par défaut
    Citation Envoyé par prologic Voir le message
    EDIT > en fait Range(pos1, pos1 + pos2) ce sont les limites ? pos1 correspond au début de la chaine et "pos1+pos2" à la fin de la première partie ?
    Oui, on demande à Word d'appliquer un style gras à une portion de texte comprise (dans le document) entre pos1 (position de l'insertion du texte) et pos1+pos2 (début + longueur du texte rajouté).

    L'application de style de texte est un casse tête avec l'interop de Word. A moins qu'un spécialiste ne vienne nous livrer une recette miracle...


    Pour ce qui est d'aligner les paragraphes, il ne faut pas travailler avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            oTitre.Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
    (ce qui change l'alignement de tous les paragraphes) mais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            oTitre.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter
    En mode lecture/écriture.

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    J'avance bien dans la mise en forme de mon document, sauf l'histoire de l'alignement qui bug toujours, même avec ta solution. je me pose la question d'un recentrage après finalisation du .doc dans le sens ou le titre restera fixe.

    Par contre, un nouveau problème apparaît : j'extrais les valeurs d'un ListView pour les insérer sous forme de tableau dans le document. La gestion du tableau, la mise en forme est bonne, mais sur mes deux tableaux (listview différentes) le premier apparaît en gras entièrement, alors que comme prévue, le second tableau n'a que sa première ligne ne gras.

    j'ai tenté de déclaré le non-gras ligne par ligne sans succès, d'appelé directement la table, sans succès... j'ai toutefois résolu le problème de la taille de texte de la première table.

    Étrangement la seconde table (même code, seule la source des données est différente) se comporte correctement.

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
            'Titre tableau A
            oInfo = docWord.Content.Paragraphs.Add(docWord.Bookmarks.Item("\endofdoc").Range)
            oInfo.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft
            oInfo.Range.Font.Size = 12
            oInfo.Range.Font.Bold = False
            oInfo.Range.Text = "Tableau A : "
            'pos1 = docWord.Range.Start
            pos2 = oInfo.Range.End - 1
            oInfo.Range.InsertAfter(Format(Now,"dd/MM/yyyy"))
            oInfo.Format.SpaceAfter = 12
            oInfo.Range.InsertParagraphAfter()
            docWord.Range(pos1, pos2).Font.Bold = True
            pos1 = oInfo.Range.End - 1
     
            'Table A
            nbligne = 0
            For Each ligne In TableA.Items
                nbligne += 1
            Next
     
            If nbligne <> 0 Then
                oTable = docWord.Tables.Add(docWord.Bookmarks.Item("\endofdoc").Range, nbligne + 1, nbcolonne)
                oTable.Range.ParagraphFormat.SpaceAfter = 6
                oTable.Range.Font.Size = 12
                oTable.Range.Font.Bold = False
                nbligne = 0
     
                'Entête
                oTable.Cell(1, 1).Range.Text = "ID"
                oTable.Cell(1, 2).Range.Text = "Nom"
                oTable.Cell(1, 3).Range.Text = "Valeur"
                oTable.Cell(1, 4).Range.Text = "Unité"
     
     
                For Each ligne In TableA.Items
                    For c = 0 To nbcolonne - 1
                        oTable.Cell(nbligne + 2, c + 1).Range.Text = ligne.SubItems(c).Text
                    Next
                    nbligne += 1
                Next
                oTable.Rows.Item(1).Range.Font.Bold = True
                oTable.Rows.Item(1).Range.Font.Italic = True
            End If
     
            oInfo.Range.Text = ""
            oInfo.Range.InsertParagraphAfter()
     
            'Titre tableau B
            oInfo = docWord.Content.Paragraphs.Add(docWord.Bookmarks.Item("\endofdoc").Range)
            oInfo.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft
            oInfo.Range.Font.Size = 12
            oInfo.Range.Font.Bold = False
            oInfo.Range.Text = "Tableau B : "
            pos2 = oInfo.Range.End - 1
            oInfo.Range.InsertAfter(Format(Now,"dd/MM/yyyy"))
            oInfo.Format.SpaceAfter = 12
            oInfo.Range.InsertParagraphAfter()
            docWord.Range(pos1, pos2).Font.Bold = True
            pos1 = oInfo.Range.End - 1
     
            'table B
            nbligne = 0
            For Each ligne In TableB.Items
                nbligne += 1
            Next
     
            If nbligne <> 0 Then
                oTable = docWord.Tables.Add(docWord.Bookmarks.Item("\endofdoc").Range, nbligne + 1, nbcolonne)
                oTable.Range.ParagraphFormat.SpaceAfter = 6
                oTable.Range.Font.Size = 12
                oTable.Range.Font.Bold = False
                nbligne = 0
     
                'Entête
                oTable.Cell(1, 1).Range.Text = "ID"
                oTable.Cell(1, 2).Range.Text = "Nom"
                oTable.Cell(1, 3).Range.Text = "Valeur"
                oTable.Cell(1, 4).Range.Text = "Unité"
     
     
                For Each ligne In TableB.Items
                    For c = 0 To nbcolonne - 1
                        oTable.Cell(nbligne + 2, c + 1).Range.Text = ligne.SubItems(c).Text
                    Next
                    nbligne += 1
                Next
                oTable.Rows.Item(1).Range.Font.Bold = True
                oTable.Rows.Item(1).Range.Font.Italic = True
            End If
     
            oInfo.Range.Text = ""
            oInfo.Range.InsertParagraphAfter()

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Salut,

    Solution trouvé pour le centrage du titre, j'utilise la même solution que pour le gras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pos1 = oTitre.Range.End - 1
    docWord.Range(docWord.Range.Start, pos1).ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter
    Pour la mise en gras involontaire du tableau, le problème venait de la solution des positions, l'intervalle de position recouvrait le tableau, le redéfinir à régler le problème.

    Merci à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/01/2013, 09h40
  2. Probleme retour en ligne apres un Signet word
    Par medhouse dans le forum VB.NET
    Réponses: 0
    Dernier message: 24/05/2009, 02h25
  3. Compléter une ligne avec des petits points "à la word"
    Par polemoss dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/05/2007, 11h38
  4. [CR .NET] Table croisée: compléter avec lignes vides
    Par kartben dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 29/06/2004, 10h38
  5. [langage] split ligne apres ligne ?
    Par simos dans le forum Langage
    Réponses: 17
    Dernier message: 25/06/2004, 15h07

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