Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

Générer un document Word .docx en ABAP avec SAP
Un billet de blog de FreeGeek

Le , par FreeGeek, Membre habitué
Dans ce tutoriel, nous allons voir comment générer un document Word grâce à SAP.

Pour se faire nous verrons quelques balises utilisées dans le WordprocessingML. Ce langage est assez simple et ressemble de prêt à de l'HTML à la sauce Office. Il permet de mettre en page tous les éléments qui composeront votre document. Si vous comprenez l'anglais, voici un lien qui vous sera très utile car il vous explique les bases de l'utilisation du WordprocessingML. Si l'anglais vous donne des boutons ou si vous ne le comprenez tout simplement pas, Microsoft a écrit de la doc en français! Il vous faudra toutefois fouiller un peu plus avec Google pour chercher ce que vous voulez parmi toutes les balises existantes. Enfin, voici un lexique de toutes les balises utilisées dans le WordprocessingML.

Nous verrons aussi un peu de XSLT. Ne commencez pas à paniquer, ce langage est lui aussi très simple à comprendre et il existe plein d'infos sur le net car il est très utilisé. En anglais j'ai pu trouver ce petit tutoriel ainsi que le document W3c. En français, un petit coup de Google me ramène ce tutoriel plutôt bien fait ainsi que la traduction du document W3C. Avec ces sites, vous en aurez largement assez pour générer un document Word avec de l'ABAP, croyez moi!

Structure d'un fichier .docx

Pour un utilisateur lambda, un fichier docx c'est ça :

Pour un informaticien, un fichier docx c'est ça :

Que s'est il passé pour qu'on en arrive là? C'est très simple, nous allons faire la manip ensemble :

1. Prenez un fichier docx avec un peu de contenu (pas un fichier que vous venez de créer et qui est vide, c'est moins intéressant)

2. Changez son extension en .zip :

3. Extrayez l'archive zip vers un dossier :

4. Ouvrez le dossier

5. Amusez vous à fouiller dans les fichiers

Je ne vais pas vous détailler la fonction de chaque fichier présent dans l'archive car cela a déjà été fait. Toutefois, je vous recommande fortement d'apprendre à quoi ils servent pour la suite de ce tuto.

Principe général


Ce tuto étant une initiation à la création de fichier docx en ABAP, nous allons créer un fichier au contenu très simpliste. Voici comment nous procéderons :
  1. Pour commencer nous devrons créer un document docx dans SAP. La bonne nouvelle c'est qu'une classe standard permet de faire ça.
  2. Ensuite, nous allons reproduire ce que nous avons fait dans le chapitre précédent : mettre ce document sous forme d'une archive zip et l'extraire.
  3. Une fois l'archive extraite, nous remplacerons le corps du document par celui que nous aurons créé.
  4. Enfin, il nous suffira de remettre le tout sous forme d'archive.

Et voici ce que nous ferons pour créer le corps que nous souhaitons remplacer dans le document :
  1. Nous réutiliserons la transformation XML de l'article Générer du XML en ABAP dans SAP afin d'avoir des données au format XML.
  2. Nous créerons une transformation XSLT dans le but de transformer nos données XML en fichier OpenXML.


Transformation en docx

Comme nous l'avons vu dans l'article Générer du XML en ABAP dans SAP, pour créer une transformation, il vous suffit de vous rendre dans la transaction XSLT_TOOL ou STRANS :


Création d'une transformation

Cliquez sur "Create" et arrivez ici :


Libellé de la transformation

Validez et vous devriez voir ceci :


XSLT program

A présent, télécharger le fichier ZTEST_DOCX_CATALOG_CD (il est en pièce jointe de ce tuto). Il contient le code source de notre transformation. Rendez vous dans l'onglet "SourceCde", supprimez tout le code que vous voyez et copiez celui du fichier à la place. Activez et le tour est joué.

Maintenant, amusez vous à détailler le code. Vous constaterez qu'il y a du WordprocessingML et du XSLT. Le premier va permettre de produire la mise en page du document et le second de travailler sur les données à afficher. D'une manière générale, les balises commençant par <w: ou </w: sont liées au langage WordprocessingML et celles commençant par <xsl: ou </xsl: sont liées au XSLT. Par exemple, pour afficher tous les cd du catalogue, nous utilisons <xsl:for-each select="CATALOG/ZTEST_XML_CD"> ... </xsl:for-each>. Cela permet de boucler sur la liste des cd qui se trouvent dans le XML. Pour afficher une valeur, nous codons <xsl:value-of select="notre_valeur"/>. Par contre, pour créer le corps du document, nous mettons <w:body>...</w:body> et pour dessiner un tableau <w:tbl>...</w:tbl>. Je ne peux pas détailler tout le code, mais avec les sites donnés en introduction de ce tuto, vous comprendrez très rapidement les balises présentent dans le code source de notre transformation.

Le programme ABAP

Voici le code source du programme ABAP qui vous permettra de générer votre premier fichier .docx :

Code : Sélectionner tout
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
 
************************************************************************ 
 *  Report: Z_TEST_ABAP_DOCX                                            * 
 *  Author: K.GRENECHE  (SAPDECOUVERTE # TUTO ABAP)                     * 
 *  Date  : 20/12/2013                                                  * 
 ************************************************************************ 
 *                       Génère un document docx                        * 
 *                                                                      * 
 ************************************************************************ 
 *                       Modification  list                             * 
 *----------------------------------------------------------------------* 
 * No modif   Author       Date     Reason of the modification          * 
 * V1.0     K.GRENECHE   20/12/13   Création                            * 
 *----------------------------------------------------------------------* 
 ************************************************************************ 
 REPORT  z_test_abap_docx. 
  
 DATA : lt_catalog  TYPE ztest_xml_catalog, 
        lw_document TYPE xstring, 
        lw_docx     TYPE xstring. 
  
 * Création des données 
 PERFORM creation_des_donnees CHANGING lt_catalog. 
  
 * Transformation des données en format docx 
 PERFORM transformation_donnees_docx CHANGING lw_document. 
  
 * Création du fichier docx avec les données 
 PERFORM creation_docx USING    lw_document 
                       CHANGING lw_docx. 
  
 * Téléchargement du fichier docx 
 PERFORM telechargement_docx USING lw_docx. 
  
 *&---------------------------------------------------------------------* 
 *&      Form  creation_des_donnees 
 *&---------------------------------------------------------------------* 
 *       text 
 *----------------------------------------------------------------------* 
 *      -->PT_CATALOG text 
 *----------------------------------------------------------------------* 
 FORM creation_des_donnees CHANGING pt_catalog TYPE ztest_xml_catalog. 
  
 * Déclaration des variables locales 
   DATA : ls_cd TYPE ztest_xml_cd. 
  
 * Début ajout de données dans notre table interne 
   ls_cd-title   = 'Empire Burlesque'. 
   ls_cd-artist  = 'Bob Dylan'. 
   ls_cd-country = 'USA'. 
   ls_cd-company = 'Columbia'. 
   ls_cd-price   = '10.90'. 
   ls_cd-zyear   = '1985'. 
  
   APPEND ls_cd TO pt_catalog. 
  
   ls_cd-title   = 'Hide your heart'. 
   ls_cd-artist  = 'Bonnie Tyler'. 
   ls_cd-country = 'UK'. 
   ls_cd-company = 'CBS Records'. 
   ls_cd-price   = '9.90'. 
   ls_cd-zyear   = '1988'. 
  
   APPEND ls_cd TO pt_catalog. 
  
   ls_cd-title   = 'Greatest Hits'. 
   ls_cd-artist  = 'Dolly Parton'. 
   ls_cd-country = 'USA'. 
   ls_cd-company = 'RCA'. 
   ls_cd-price   = '9.90'. 
   ls_cd-zyear   = '1982'. 
  
   APPEND ls_cd TO pt_catalog. 
  
   ls_cd-title   = 'Still got the blues'. 
   ls_cd-artist  = 'Gary Moore'. 
   ls_cd-country = 'UK'. 
   ls_cd-company = 'Virgin records'. 
   ls_cd-price   = '10.20'. 
   ls_cd-zyear   = '1990'. 
  
   APPEND ls_cd TO pt_catalog. 
  
   ls_cd-title   = 'Eros'. 
   ls_cd-artist  = 'Eros Ramazzotti'. 
   ls_cd-country = 'EU'. 
   ls_cd-company = 'BMG'. 
   ls_cd-price   = '9.90'. 
   ls_cd-zyear   = '1997'. 
  
   APPEND ls_cd TO pt_catalog. 
 * Fin ajout de données dans notre table interne 
  
 ENDFORM.                    " CREATION_DES_DONNEES 
  
 *&---------------------------------------------------------------------* 
 *&      Form  TRANSFORMATION_DONNEES_DOCX 
 *&---------------------------------------------------------------------* 
 *       text 
 *----------------------------------------------------------------------* 
 *      -->PW_DOCUMENT  text 
 *----------------------------------------------------------------------* 
 FORM transformation_donnees_docx  CHANGING pw_document TYPE xstring. 
  
 * Déclaration des variables locales 
   DATA : lw_xml TYPE xstring. 
  
 * Transformation de nos données en xml 
   CALL TRANSFORMATION ztest_xml_catalog_cd 
   SOURCE catalog = lt_catalog[] 
   RESULT XML lw_xml. 
  
 * Transformation de notre xml en docx 
   CALL TRANSFORMATION ztest_docx_catalog_cd 
   SOURCE XML lw_xml 
   RESULT XML pw_document. 
 ENDFORM.                    " TRANSFORMATION_DONNEES_DOCX 
  
 *&---------------------------------------------------------------------* 
 *&      Form  CREATION_DOCX 
 *&---------------------------------------------------------------------* 
 *       text 
 *----------------------------------------------------------------------* 
 *      -->PW_DOCUMENT  text 
 *      -->PW_DOCX      text 
 *----------------------------------------------------------------------* 
 FORM creation_docx  USING    pw_document TYPE xstring 
                     CHANGING pw_docx     TYPE xstring. 
  
 * Déclaration des variables locales 
   DATA :  lo_zip TYPE REF TO cl_abap_zip. 
  
 * Création d'un document docx 
   pw_docx = cl_docx_form=>create_form(  ). 
  
 * Création du zip 
   CREATE OBJECT lo_zip. 
  
 * Chargement du docx dans le zip 
   CALL METHOD lo_zip->load 
     EXPORTING 
       zip             = pw_docx 
     EXCEPTIONS 
       zip_parse_error = 1 
       OTHERS          = 2. 
  
 * Suppression du corps du docx 
   CALL METHOD lo_zip->delete 
     EXPORTING 
       name            = 'word/document.xml' 
     EXCEPTIONS 
       zip_index_error = 1 
       OTHERS          = 2. 
  
 * Ajout de nos données au format docx dans le corps 
   CALL METHOD lo_zip->add 
     EXPORTING 
       name    = 'word/document.xml' 
       content = pw_document. 
  
 * Sauvegarde du zip 
   CALL METHOD lo_zip->save 
     RECEIVING 
       zip = pw_docx. 
 ENDFORM.                    " CREATION_DOCX 
  
 *&---------------------------------------------------------------------* 
 *&      Form  TELECHARGEMENT_DOCX 
 *&---------------------------------------------------------------------* 
 *       text 
 *----------------------------------------------------------------------* 
 *      -->PW_DOCX    text 
 *----------------------------------------------------------------------* 
 FORM telechargement_docx USING pw_docx TYPE xstring. 
  
 * Déclaration des variables locales 
   DATA: ls_fout         TYPE string, 
         lt_data_tab_out TYPE STANDARD TABLE OF x255, 
         lv_lraw         TYPE x255, 
         lv_xlen         TYPE i, 
         lv_count        TYPE i, 
         lv_off          TYPE i, 
         lv_mod          TYPE i. 
  
 * Converti le docx en table de 255 caractères 
   REFRESH lt_data_tab_out. 
   CLEAR   lv_off. 
   lv_xlen  = xstrlen( lw_docx ). 
   lv_count = lv_xlen DIV 255. 
   DO lv_count TIMES. 
     lv_lraw = lw_docx+lv_off(255). 
     lv_off = lv_off + 255. 
     APPEND lv_lraw TO lt_data_tab_out. 
   ENDDO. 
 
  
   lv_mod = lv_xlen MOD 255. 
   IF lv_mod > 0. 
     lv_lraw = lw_docx+lv_off(lv_mod). 
     APPEND lv_lraw TO lt_data_tab_out. 
   ENDIF. 
  
 * Ecriture du fichier sur le pc client 
   CALL METHOD cl_gui_frontend_services=>gui_download 
     EXPORTING 
       bin_filesize            = lv_xlen 
       filename                = 'C:\Users\kevin_greneche\Desktop\test_abap_docx.docx' 
       filetype                = 'BIN' 
       confirm_overwrite       = 'X' 
     CHANGING 
       data_tab                = lt_data_tab_out 
     EXCEPTIONS 
       file_write_error        = 1 
       no_batch                = 2 
       gui_refuse_filetransfer = 3 
       invalid_type            = 4 
       no_authority            = 5 
       unknown_error           = 6 
       header_not_allowed      = 7 
       separator_not_allowed   = 8 
       filesize_not_allowed    = 9 
       header_too_long         = 10 
       dp_error_create         = 11 
       dp_error_send           = 12 
       dp_error_write          = 13 
       unknown_dp_error        = 14 
       access_denied           = 15 
       dp_out_of_memory        = 16 
       disk_full               = 17 
       dp_timeout              = 18 
       file_not_found          = 19 
       dataprovider_exception  = 20 
       control_flush_error     = 21 
       not_supported_by_gui    = 22 
       error_no_gui            = 23 
       OTHERS                  = 24. 
  
 * Récupération des erreurs 
   IF sy-subrc NE 0. 
     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno. 
   ENDIF. 
 ENDFORM.                    " TELECHARGEMENT_DOCX
Il a l'air long, mais toute la création des données et la transformation en XML vient de l'article Générer du XML en ABAP dans SAP. Nous avons juste ajouté la transformation en docx, la création du fichier ainsi que son téléchargement!

Astuce

Créer manuellement la structure d'un fichier docx avec du WordprocessingML est assez laborieux... Pour vous évitez une crise de nerfs, je vous conseille de d'abord créer le fichier, que vous souhaiteriez obtenir, en utilisant Word. Ensuite, fouillez dans l'archive du document créé sous Word et copiez le code qui vous intéressera. En général, le code produit par Word nécessite d'être retouché car il n'est pas aussi propre que si vous l'aviez produit vous même, mais c'est souvent plus rapide que de partir de rien.

J'espère que ce tutoriel vous a intéressé. J'attends vos questions ou remarques en commentaire

A bientôt sur SAPDécouverte!

ABAPement.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :
Offres d'emploi IT
Chef de projet technique H/F
Safran - Ile de France - Melun (77000)
Architecte systèmes externes TP400 H/F
Safran - Ile de France - Moissy-Cramayel (77550)
Ingénieur produit (Landing gear) H/F
Safran - Ile de France - MASSY Hussenot

Voir plus d'offres Voir la carte des offres IT
Responsable bénévole de la rubrique SAP : doc malkovich -