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

ASP.NET Discussion :

Comportement ASP.Net/VB.Net et Word sur Serveur IIS7


Sujet :

ASP.NET

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Comportement ASP.Net/VB.Net et Word sur Serveur IIS7


    J'ai développé une application web (plutôt projet site web) qui permet de créer des rapports en format Word. Lorsque je la test en local via VS2010, je n'ai aucun problème mais une fois sur le serveur, lorsque je veux créer un fichier Word via mon fichier modèle (dotx), cela ne marche plus. Voici le message en retour lors de la tentative de création d'un objet Word:
    Word n'a pas pu lire ce document. Il est peut-être corrompu.
    Essayez l'une ou plusieurs des opérations suivantes :
    * Ouvrez et réparez le fichier.
    * Ouvrez le fichier avec le convertisseur Récupération de texte.
    Mon code, un peu long, je fournit le constructeur (j'ai tout englobé dans une classe):
    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Imports IWord = Microsoft.Office.Interop.Word
    Imports System.Runtime.InteropServices.Marshal
    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                Protected _word As IWord.Application
                Protected _doc As IWord.Document
    Code vbnet : 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
     
                Sub New(ByVal wordModel As String, Optional ByVal showWordInstance As Boolean = True)
                    Try
                        _word = New IWord.Application
     
                        _word.Visible = showWordInstance
                        _doc = _word.Documents.Add(wordModel)
     
                        _docPath = wordModel
                    Catch ex As Exception
                        If Not IsNothing(_doc) Then
                            _doc.Close(False)
                        End If
                        If Not IsNothing(_word) Then
                            _word.Quit()
                        End If
     
                        Throw ex
                    End Try
                End Sub
    Ma méthode Dispose:
    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                Protected Overridable Sub Dispose(disposing As Boolean)
                    If Not Me.disposedValue Then
                        If disposing Then
                        End If
     
                        ReleaseComObject(_doc)
                        ReleaseComObject(_word)
     
                        GC.Collect()
                        GC.WaitForPendingFinalizers()
                    End If
                    Me.disposedValue = True
                End Sub
    Autre chose que j'ai également remarqué, une fois que je lance le programme sur le serveur, il ne me quitte pas WINWORD.EXE et si dans le Catch de l'exception du constructeur j'utilise ReleaseComObject, le programme ne rend pas la main. J'utilise l'emprunt d'identité (pas le choix) dans le fichier Web.config et du coup, j'ai rajouté dans la partie Sécurité du fichier modèle et de WINWORD.EXE ASP NET_2006 mais ça ne donne rien.

    Est-ce que quelqu'un pourrait me donner la bonne marche à suivre s'il vous plaît ?


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    Je remonte le sujet car je suis toujours preneur d'une solution...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Je ne connais pas la solution a ton probleme, mais tes administrateurs systeme doivent s'arracher les cheveux si tu as installe Word sur un serveur de prod

    Il vaut mieux eviter de faire ca, et plutot d'utiliser des librairies qui gerent l'OpenXML. Elles n'ont pas besoin d'Office pour fonctionner. Par exemple : EPPlus.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    A ce que j'en lis, c'est pour Excel ton EPPlus...
    Cela dit, vu l'avancée du projet et l'urgence dans laquelle il faut le finir, je ne peux plus vraiment changer de technique de génération de fichier Word.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Pour appuyer le message de DotNetMat :
    Installer word sur un serveur ne peut que causer des problèmes.
    Exemple de problème rencontré :
    • Le process winword qui n'est pas jamais arreté... Obligé de faire un deamon pour killer le process...
    • Fuite mémoire du process Winword...



    Aujourd'hui je ai utilisé pour la plupart du temps des librairies mais plus aucune problème.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    D'accord, je vais voir du côté de DocX, je vais voir surtout si l'adaptation n'est pas trop longue.

    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Avec DocX, est-il possible de créer un document à partir d'un modèle (*.dotx) ? J'ai pas l'impression à première vue...
    Je demande car je me base justement sur un modèle avec des bookmarks pour positionner les éléments (images, tableaux, etc...) à des endroits bien précis.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Avec DocX, est-il possible de créer un document à partir d'un modèle (*.dotx)
    Il veut bien modifier le document mais j'arrive pas à l'ouvrir après....

    Citation Envoyé par Franck.H Voir le message
    Je demande car je me base justement sur un modèle avec des bookmarks pour positionner les éléments (images, tableaux, etc...) à des endroits bien précis.
    J'ai l'impression...

    Voici mon code vite fait :
    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
                using (var doc = DocX.Load(@"C:\Users\xxxxx\Documents\Modele.dotx"))
                {
                    Console.WriteLine($"Bookmarks {doc.Bookmarks.Count}");
                    bool isFirst = true;
     
                    foreach (var bookmark in doc.Bookmarks)
                    {
                        Console.WriteLine(bookmark.Name);
                        Console.WriteLine(bookmark.Paragraph);
                        if (isFirst)
                            bookmark.SetText("Bonjour");
                        isFirst = false;
                    }
                    doc.SaveAs(@"C:\Users\xxxxx\Documents\Modele.docx");
                }

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    A ce que j'en lis, c'est pour Excel ton EPPlus...
    Cela dit, vu l'avancée du projet et l'urgence dans laquelle il faut le finir, je ne peux plus vraiment changer de technique de génération de fichier Word.
    Au temps pour moi ! EPPlus est bien pour Excel. Merci katkiller
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par katkiller Voir le message
    Il veut bien modifier le document mais j'arrive pas à l'ouvrir après....
    J'ai également le même problème... c'est très fâcheux effectivement

    [EDIT]
    J'ai converti mon *.dotx en *.docx et là ça fonctionne, je pense que la bibliothèque DocX ne prend pas (correctement en tous cas) en charge les fichiers modèle.

    [EDIT 2]
    Aucune méthode pour insérer des tableaux et images au niveau des bookmarks donc bibliothèque complètement inutile... SI jamais quelqu'un possède une réponse positive à ma première question je prends !


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    A priori ceci fonctionne:

    I know it is time that this item has been opened, but as I had not found the answer anywhere, following solution for those who need it.

    1 - In IIS, the application pool used by the application, change the Identity attribute to LocalSystem

    2 - Create a folder called Desktop within the following directories on the server: C:\Windows\System32\config\systemprofile and C:\Windows\SysWOW64\config\systemprofile

    After that, give full permission for these two folders to the user group IIS: IIS_IUSRS

    This will cause this user to have a "desktop" to work, thereby achieving the IIS Word use the library.

    I rough it helps someone.
    Tiré du lien qu'on m'a donné sur le forum MSDN, le fichier n'est plus considéré comme corrompu mais, il reste le fait que le fichier n'est pas enregistré et le processus n'est pas kill
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    Nouveau nouvelle erreur:
    Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80080005 Échec de l’exécution du serveur (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).


    Le CLSID correspond à
    Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C
    mais je n'en trouve pas la trace par exemple avec DCOMCNFG

    [Edit]
    J'ai ajouté les Services de composants pour le mode 32bits par le biais de
    Mais cela ne change rien...

    [Edit 2]
    Ce qui me semble bizarre, c'est que sur le serveur, une instance de WINWORD.EXE est tout de même créé, ça veut dire qu'il accède quand même à l'objet COM, je ne comprend pas trop l'erreur du coup...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    Après pas mal de lecture, j'ai fini par abandonné l'idée d'utiliser les objets COM sur le serveur

    Cependant, il me faudrait un moyen pour que je puisse mettre images/tableaux/textes à des emplacements spécifiques matérialisés par des signets.
    Je ne veux pas devoir créer un fichier de A à Z à partir du code mais pouvoir utiliser un fichier *.docx/*.dotx dont je remplis le vide et je dois donc pouvoir positionner mes objets à des pages/emplacements précis.

    J'ai testé plusieurs techniques avec DocX mais je me heurte toujours à cette problématique...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  14. #14
    Membre confirmé Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    337
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 337
    Points : 458
    Points
    458
    Par défaut
    Salut,

    Pour avoir fait pas mal d'automation office côté serveur, je te le dis clairement et simplement (et je ne fais que répéter ce qui a été précédemment écrit) : STOP. Ne le fais pas. Ce n'est pas fait pour.

    La MSDN est claire à ce sujet :
    Microsoft does not recommend or support server-side Automation of Office
    Ce qui est parfaitement compréhensible, attendu que les produits Office sont des produits utilisateur. Donc, demandant une interaction avec l'utilisateur. Toute utilisation côté serveur, aussi fonctionnelle soit elle, n'est qu'un vilain hack.
    Tu peux gérer ce problème de processus qui reste ouvert en récupérant le PID du processus à l'ouverture, puis en killant ce process à partir de son PID quand tu as fini ton traitement. Tu peux aussi créer un batch qui nettoie les fichiers .tmp créés en pagaille par office dans un sous sous sous sous dossier planqué dans System32. Tu peux contourner tous les problèmes, mais c'est moche. Très moche. Et extrêmement pas performant du tout.

    Pour solutionner le problème de manière propre et performante, tu dois passer par une librairie tierce. Et pour en avoir essayé un gros paquet, la seule qui ait répondu à tous mes besoins (qui peuvent être différents des tiens) est ASPOSE . Mais c'est payant. Mais ça vaut le coup.

    Concernant ton problème avec docX, as tu essayé de simplement :
    - Ouvrir ton fichier template (.dotx)
    - L'enregistrer en tant que fichier normal (.docx)
    - Remplacer des "tags" que tu aurais créé toi même (dans tes emplacements vides) par le contenu attendu
    Cf : http://cathalscorner.blogspot.fr/201...uments-in.html
    Tant va la cruche à l'eau qu'à la fin y'a plus d'eau.

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    J'ai un peu bossé sur l'OpenXML, je vous donne ce que j'ai déjà fait et qui est fonctionnel, le tout pour le moment basé sur les bookmark mais ça évoluera plus tard:
    Code vb : 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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    Imports System
    Imports System.IO
    Imports System.Text
    Imports System.Linq
    Imports System.Xml
    Imports System.Xml.Linq
    Imports System.Collections.Generic
    Imports System.Drawing.Graphics
    Imports DocumentFormat.OpenXml
    Imports DocumentFormat.OpenXml.Packaging
    Imports WP = DocumentFormat.OpenXml.Wordprocessing
    Imports A = DocumentFormat.OpenXml.Drawing
    Imports DW = DocumentFormat.OpenXml.Drawing.Wordprocessing
    Imports PIC = DocumentFormat.OpenXml.Drawing.Pictures
     
    Namespace SDEA
        Namespace Interop
            Public Class Word
                Implements IDisposable
     
    #Region "Membres privés"
                Protected _wpd As WordprocessingDocument
                Protected _doc As MainDocumentPart
                Protected _modelePath As String
                Protected _finalDocPath As String
    #End Region
     
    #Region "Propriétés publiques"
                Public ReadOnly Property ModeleFullName() As String
                    Get
                        Return _modelePath
                    End Get
                End Property
     
                Public ReadOnly Property WordProcessingDocument() As WordprocessingDocument
                    Get
                        Return _wpd
                    End Get
                End Property
     
                Public ReadOnly Property MainDocumentPart() As MainDocumentPart
                    Get
                        Return _doc
                    End Get
                End Property
    #End Region
     
    #Region "Constructeurs/Destructeurs"
                Sub New(ByVal wordModel As String, ByVal finalDocFullPath As String)
                    Try
                        FileCopy(wordModel, finalDocFullPath)
     
                        _modelePath = wordModel
                        _finalDocPath = finalDocFullPath
                        _wpd = WordProcessingDocument.Open(_finalDocPath, True)
                        _doc = _wpd.MainDocumentPart
                    Catch ex As Exception
                        Throw ex
                    End Try
                End Sub
    #End Region
     
    #Region "Procédures et fonctions publiques"
                Public Sub Save()
                    _doc.Document.Save()
                End Sub
     
    #Region "Insertion de texte"
                Public Sub InsertText(ByVal bookmark As String, ByVal text As String)
                    Try
                        Dim body = _doc.Document.GetFirstChild(Of WP.Body)()
                        Dim paras = body.Descendants(Of WP.Paragraph)()
     
                        For Each para In paras
                            Dim bookMarkStarts = para.Elements(Of WP.BookmarkStart)()
                            Dim bookMarkEnds = para.Elements(Of WP.BookmarkEnd)()
     
                            For Each BookmarkStart In bookMarkStarts
                                If BookmarkStart.Name = bookmark Then
                                    Dim id = BookmarkStart.Id.Value
                                    Dim b = bookMarkEnds.First(Function(x) x.Id.Value = id)
                                    Dim run = New WP.Run()
     
                                    run.Append(New WP.Text(text))
                                    para.InsertBefore(run, b)
                                End If
                            Next
                        Next
                    Catch ex As Exception
                        Throw ex
                    End Try
                End Sub
     
                Public Sub InsertText(ByVal dic As Dictionary(Of String, String))
                    Try
                        Dim body = _doc.Document.GetFirstChild(Of WP.Body)()
                        Dim paras = body.Descendants(Of WP.Paragraph)()
     
                        For Each para In paras
                            Dim bookMarkStarts = para.Elements(Of WP.BookmarkStart)()
                            Dim bookMarkEnds = para.Elements(Of WP.BookmarkEnd)()
     
                            For Each BookmarkStart In bookMarkStarts
                                For Each elem In dic
                                    If BookmarkStart.Name = elem.Key Then
                                        Dim id = BookmarkStart.Id.Value
                                        Dim b = bookMarkEnds.First(Function(x) x.Id.Value = id)
                                        Dim run = New WP.Run()
     
                                        run.Append(New WP.Text(elem.Value))
                                        para.InsertBefore(run, b)
                                    End If
                                Next
                            Next
                        Next
                    Catch ex As Exception
                        Throw ex
                    End Try
                End Sub
     
                'Public Sub InsertText(ByVal tabIndex As Integer,
                '                      ByVal rowIndex As Integer,
                '                      ByVal cellIndex As Integer,
                '                      ByVal text As String)
     
                '    Try
                '        Dim body = _doc.Document.GetFirstChild(Of WP.Body)()
                '        Dim table = body.Elements(Of WP.Table)().ElementAt(tabIndex)
                '        Dim row = table.Elements(Of WP.TableRow)().ElementAt(rowIndex)
                '        Dim cell = row.Elements(Of WP.TableCell)().ElementAt(cellIndex)
                '        Dim p = cell.Elements(Of WP.Paragraph)().First()
                '        Dim r = p.Elements(Of WP.Run)().First()
                '        Dim t As New WP.Text()
     
                '        t.Text = text
                '        r.Append(t)
                '    Catch ex As Exception
                '        Throw ex
                '    End Try
                'End Sub
    #End Region
     
    #Region "Insertion d'image"
                Public Sub InsertImage(ByVal bookmark As String,
                                       ByVal filename As String,
                                       Optional ByVal imageScale As Integer = 100,
                                       Optional ByVal imageType As ImagePartType = ImagePartType.Jpeg)
                    Try
                        Dim body = _doc.Document.GetFirstChild(Of WP.Body)()
                        Dim paras = body.Descendants(Of WP.Paragraph)()
     
                        For Each para In paras
                            Dim bookMarkStarts = para.Elements(Of WP.BookmarkStart)()
                            Dim bookMarkEnds = para.Elements(Of WP.BookmarkEnd)()
     
                            For Each BookmarkStart In bookMarkStarts
                                If BookmarkStart.Name = bookmark Then
                                    Dim id = BookmarkStart.Id.Value
                                    Dim b = bookMarkEnds.First(Function(x) x.Id.Value = id)
                                    Dim run = New WP.Run()
                                    Dim img As ImagePart = _doc.AddImagePart(imageType)
     
                                    Using s As New FileStream(filename, FileMode.Open)
                                        img.FeedData(s)
                                    End Using
     
                                    run.Append(CreateImageReference(_doc.GetIdOfPart(img), imageScale))
                                    para.InsertBefore(run, b)
                                End If
                            Next
                        Next
                    Catch ex As Exception
                        Throw ex
                    End Try
                End Sub
     
                Protected Function CreateImageReference(ByVal relationshipId As String, ByVal zoom As Integer) As WP.Drawing
                    Dim element = New WP.Drawing( _
                                      New DW.Inline( _
                                  New DW.Extent() With {.Cx = Convert.ToInt64(800 * zoom / 100) * 9525, .Cy = Convert.ToInt64(400 * zoom / 100) * 9525}, _
                                  New DW.EffectExtent() With {.LeftEdge = 0L, .TopEdge = 0L, .RightEdge = 0L, .BottomEdge = 0L}, _
                                  New DW.DocProperties() With {.Id = CType(1UI, UInt32Value), .Name = relationshipId}, _
                                  New DW.NonVisualGraphicFrameDrawingProperties( _
                                      New A.GraphicFrameLocks() With {.NoChangeAspect = True} _
                                      ), _
                                  New A.Graphic(New A.GraphicData( _
                                                New PIC.Picture( _
                                                    New PIC.NonVisualPictureProperties( _
                                                        New PIC.NonVisualDrawingProperties() With {.Id = 0UI, .Name = relationshipId}, _
                                                        New PIC.NonVisualPictureDrawingProperties() _
                                                        ), _
                                                    New PIC.BlipFill( _
                                                        New A.Blip( _
                                                            New A.BlipExtensionList( _
                                                                New A.BlipExtension() With {.Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"}) _
                                                            ) With {.Embed = relationshipId, .CompressionState = A.BlipCompressionValues.Print}, _
                                                        New A.Stretch( _
                                                            New A.FillRectangle() _
                                                            ) _
                                                        ), _
                                                    New PIC.ShapeProperties( _
                                                        New A.Transform2D( _
                                                            New A.Offset() With {.X = 0L, .Y = 0L}, _
                                                            New A.Extents() With {.Cx = Convert.ToInt64(800 * zoom / 100) * 9525, .Cy = Convert.ToInt64(400 * zoom / 100) * 9525}), _
                                                        New A.PresetGeometry( _
                                                            New A.AdjustValueList() _
                                                            ) With {.Preset = A.ShapeTypeValues.Rectangle} _
                                                        ) _
                                                    ) _
                                                ) With {.Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"} _
                                            ) _
                                        ) With {.DistanceFromTop = 0UI, _
                                                .DistanceFromBottom = 0UI, _
                                                .DistanceFromLeft = 0UI, _
                                                .DistanceFromRight = 0UI} _
                                    )
     
                    Return element
                End Function
    #End Region
     
    #Region "Insertion de tableau"
                'Public Sub InsererTableau(ByVal bookmark As String,
                '                          Optional ByVal nbRows As Integer = 1,
                '                          Optional ByVal nbCols As Integer = 1,
                '                          Optional ByVal widthPercent As Integer = 100,
                '                          Optional ByVal style As String = "")
     
                '    Dim body = _doc.Document.GetFirstChild(Of WP.Body)()
                '    Dim paras = body.Descendants(Of WP.Paragraph)()
     
                '    For Each para In paras
                '        Dim bookMarkStarts = para.Elements(Of WP.BookmarkStart)()
                '        Dim bookMarkEnds = para.Elements(Of WP.BookmarkEnd)()
     
                '        For Each BookmarkStart In bookMarkStarts
                '            If BookmarkStart.Name = bookmark Then
                '                Dim id = BookmarkStart.Id.Value
                '                Dim b = bookMarkEnds.First(Function(x) x.Id.Value = id)
                '                Dim run = New WP.Run()
     
                '                run.Append(CreateTable(style, widthPercent, nbRows, nbCols))
                '                para.InsertBefore(run, b)
                '            End If
                '        Next
                '    Next
                'End Sub
     
                Public Sub InsererTableau(ByVal bookmark As String,
                                          ByRef tableSource As System.Web.UI.WebControls.Table,
                                          Optional ByVal widthPercent As Integer = 100,
                                          Optional ByVal style As String = "")
     
                    Dim body = _doc.Document.GetFirstChild(Of WP.Body)()
                    Dim paras = body.Descendants(Of WP.Paragraph)()
     
                    For Each para In paras
                        Dim bookMarkStarts = para.Elements(Of WP.BookmarkStart)()
                        Dim bookMarkEnds = para.Elements(Of WP.BookmarkEnd)()
     
                        For Each BookmarkStart In bookMarkStarts
                            If BookmarkStart.Name = bookmark Then
                                Dim id = BookmarkStart.Id.Value
                                Dim b = bookMarkEnds.First(Function(x) x.Id.Value = id)
                                Dim run = New WP.Run()
     
                                run.Append(CreateTable(tableSource, style, widthPercent))
                                para.InsertBefore(run, b)
                            End If
                        Next
                    Next
                End Sub
     
                Protected Function CreateTable(ByVal wordTheme As String, ByVal widthPercent As Integer, ByVal nbRows As Integer, ByVal nbCols As Integer) As WP.Table
                    Dim t As New WP.Table()
     
                    '* Ajout des propriétés générales du tableau
                    t.Append(CreateTableProperties(wordTheme, widthPercent))
     
                    '* Création du tableau avec le nombre de lignes et de colonnes demandé
                    For i As Integer = 0 To nbRows - 1
                        Dim tr As New WP.TableRow()
     
                        For j As Integer = 0 To nbCols - 1
                            Dim td As New WP.TableCell()
                            Dim para As New WP.Paragraph()
     
                            td.Append(para)
                            tr.Append(td)
                        Next
     
                        t.Append(tr)
                    Next
     
                    Return t
                End Function
     
                Protected Function CreateTable(ByVal tb As System.Web.UI.WebControls.Table, ByVal wordTheme As String, ByVal widthPercent As Integer) As WP.Table
                    Dim t As New WP.Table()
     
                    '* Ajout des propriétés générales du tableau
                    t.Append(CreateTableProperties(wordTheme, widthPercent))
     
                    '* Création du tableau en parcourant le tableau VB
                    For i As Integer = 0 To tb.Rows.Count - 1
                        Dim tr As New WP.TableRow()
     
                        For j As Integer = 0 To tb.Rows(i).Cells.Count - 1
                            Dim td As New WP.TableCell()
                            Dim para As New WP.Paragraph()
                            Dim txt As New WP.Text()
                            Dim run As New WP.Run()
     
                            txt.Text = tb.Rows(i).Cells(j).Text
                            run.Append(txt)
                            para.Append(run)
                            td.Append(para)
                            tr.Append(td)
                        Next
     
                        t.Append(tr)
                    Next
     
                    Return t
                End Function
     
                Protected Function CreateTableProperties(ByVal wordTheme As String, ByVal widthPercent As Integer) As WP.TableProperties
                    Dim tableProp As New WP.TableProperties()
                    Dim tableStyle As New WP.TableStyle() With {.Val = wordTheme}
                    Dim tableWidth As New WP.TableWidth() With {.Width = widthPercent.ToString & "%", .Type = WP.TableWidthUnitValues.Pct}
                    Dim tableLook As New WP.TableLook() With {.FirstRow = True, _
                                                              .LastRow = False, _
                                                              .FirstColumn = True, _
                                                              .LastColumn = False, _
                                                              .NoHorizontalBand = False, _
                                                              .NoVerticalBand = True}
     
                    With tableProp
                        .Append(tableStyle)
                        .Append(tableWidth)
                        .Append(tableLook)
                    End With
     
                    Return tableProp
                End Function
    #End Region
    #End Region
     
    #Region "IDisposable Support"
                Private disposedValue As Boolean
     
                Protected Overridable Sub Dispose(disposing As Boolean)
                    If Not Me.disposedValue Then
                        If disposing Then
                            ' TODO: supprimez l'état managé (objets managés).
                            _wpd.Close()
                            _wpd.Dispose()
                        End If
     
                        ' TODO: libérez les ressources non managées (objets non managés) et substituez la méthode Finalize() ci-dessous.
                        ' TODO: définissez les champs volumineux à null.
                    End If
                    Me.disposedValue = True
                End Sub
     
                ' TODO: substituez Finalize() uniquement si Dispose(ByVal disposing As Boolean) ci-dessus comporte du code permettant de libérer des ressources non managées.
                Protected Overrides Sub Finalize()
                    ' Ne modifiez pas ce code. Ajoutez du code de nettoyage dans Dispose(ByVal disposing As Boolean) ci-dessus.
                    Dispose(False)
                    MyBase.Finalize()
                End Sub
     
                Public Sub Dispose() Implements IDisposable.Dispose
                    Dispose(True)
                    GC.SuppressFinalize(Me)
                End Sub
    #End Region
            End Class
        End Namespace
    End Namespace
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/03/2010, 11h07
  2. [.net 2.0] Open office sur serveur Web
    Par cyrilc dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/02/2009, 15h36
  3. Quel langage entre vb.net c#.net c++.net java ?
    Par heeedi dans le forum Débuter
    Réponses: 7
    Dernier message: 13/12/2008, 21h53
  4. Réponses: 1
    Dernier message: 29/04/2008, 23h53
  5. Réponses: 5
    Dernier message: 21/11/2007, 11h06

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