Quelquepart

Blog d'un développeur

Vous êtes ici : Accueil>Application>SAP : Générer un document Word DOCX en ABAP

SAP : Générer un document Word DOCX en ABAP

Rédigé par Sébastien Hermann dans Application - 12 commentaires

Le mois dernier je vous ai présenté ma classe d'abstraction pour faire communiquer SAP et Word en utilisant les liens OLE. Bien que j'adore cette méthode pleine de poésie, ce n'est pas très rapide ni pratique pour générer de gros ou nombreux documents. J'ai donc du réfléchir à une autre méthode : créer des fichiers DOCX directement sans utiliser Microsoft.

Afin de pouvoir transformer rapidement mes différents projets clients utilisant l'ancienne classe, j'en ai repris l'interface : les méthodes portent le même nom et utilisent les mêmes paramètres (autant que possible)

Je vous livre donc cette nouvelle classe d'abstraction qui permet de générer un fichier DOCX directement en ABAP. Contrairement aux différents projets balbutiants et aux tutos que j'ai pu voir sur le net, ici la prise en main est ultra simple : un document "hello world" se génère en quelques lignes !

Sont gérés par la classe :

  • Création de document vierge ou via template (docx/docm/dotx/dotm)
  • Écriture de texte avec ou sans style (style de paragraphe et/ou de police)
  • Option bold, italique, souligné, barré, indice, exposant, petite majuscules, choix de police et taille, couleur, surlignage, espacement de caractères
  • Gestion de l'alignement, de l'indentation, du retrait, des espaces avant et après le paragraphe, de l'interligne, des bordures de paragraphe et couleur de fond
  • Saut de ligne, de page, de section et section continue
  • Écriture de tableau avec ou sans style de tableau (et possibilité de définir des option de formatage par cellule : gras, couleur...)
  • Écriture d’entête/pied de page simples
  • Gestion de l'orientation (portrait/paysage) et des bordures de page
  • Insertion d'image
  • Insertion de note de bas de page ou de fin de document
  • Insertion de commentaires
  • Insertion de dessin (canvas)
  • Insertion de table des matières
  • Insertion de libellés numérotés (figure, table...)
  • Insertion de table de libellés (figures, tables...)
  • Insertion de propriété de document et de champs personnalisés (custom fields)
  • Mise à jour des propriétés de document
  • Création de style (caractère, paragraphe)
  • Prise en charge des images/templates dans le SAP Web Repository (SAPWR via la stransaction SMW0)
  • Pour les utilisateurs avancées ayant des besoins non gérés, possibilité d'inclure un fragment XML de votre composition dans le document en cours

Pour le téléchargement, je livre un programme de démo de la classe qui montre comment l'utiliser. Le zip contient :

  • Le package NUGG avec programme de démo et classe dans un "include" séparé
  • Un template word et 3 images utilisés par le programme démo
  • Un fichier TXT contenant la classe pour ceux qui veulent jeter un oeil au code sans saplink

Prochainement, un cas d'usage sur BW...

12 commentaires

#1 Sébastien Hermann a dit :

Mise a jour 1.1 :
- Option pour conserver le contenu d'un template et pas uniquement son formatage
- Insertion de note de bas de page/fin de document
- Insertion de commentaires
- Insertion d'images dans les tableaux
- Insertion de xml dans les tableau (pour mise en forme complexe)
- Option pour récupérer le xml d'un paragraphe
- Insertion de libellé
- Insertion de table des libellés
- Sauvegarde de DOCX sur le serveur SAP
- Correction de bugs
- Externalisation de la classe dans un include séparé, renommage du programme test en ZDEMO_DOCX

#2 Sébastien Hermann a dit :

Mise à jour 1.2 :
- Option pour désactiver la vérification d'orthographe
- Option pour autoriser les cellules fusionnées dans les tableaux

Cette version est un prérequis pour ZAUTODOC

#3 sbrada a dit :

Bonjour Sébastien,

Merci beaucoup pour cet outil. J'ai un problème quand j'essaie ouvrir le fichier Word "test_doc.docx" qui est créé par ZDEMO_DOCX.

Voici le détail de l'erreur :

Impossible d'ouvrir le fichier. Des problèmes ont été décelés dans son contenu.
Emplacement Partie /word/document.xml, Ligne 1, Colonne 5103

Sais-tu ce qui peut causer cet erreur ?

Merci d'avance,
Sam

#4 Sébastien Hermann a dit :

Bonjour Sam,
Je pense que tu n'as pas modifié le chemin des différents fichiers dans le programme de démo pour qu'ils pointent vers les bons endroits sur ton disque.
Si ce n'est pas ca ton probleme, envoie moi le fichier généré a mon adresse mail quelquepart@yopmail.com
et préviens moi ici stp :)

#5 sbrada a dit :

Bonjour Sébastien,
Non, je ne pense pas que c'est ça mon cas. Je viens de t'envoyer le fichier généré par e-mail. Merci encore.
Sam

#6 sandraros a dit :

Bonjour Sébastien, je vois que tu proposes le code source "pour ceux qui n'auraient pas saplink". Pourrais-je t'envoyer un XSLT qui transforme un nugget saplink en HTML? (et comment puis-je?) Merci! "keep up the good work!"

#7 Andreas a dit :

Perfect this cl_word
One question - how can I replace a field/value in a DOTX directly by ABAP. Backgroud is that I have a template and want to fill in some SAP-relevant values - example replacing <KNA1-KUNNR> & <KNA1-NAME1> by values out of ABAP - is this possible

#8 Sébastien Hermann a dit :

Hello Andreas,

Yes it is possible, but not simple.
ZCL_WORD can help you, but is not able to do it actually, you will have to enhance it.

First, load your template using ZCL_WORD

Then, create a new method to search / replace your strings in the loaded document.
Use your new method to replace strings 1 by 1 by the desired values.

Then, use ZCL_WORD to save your modified document.

#9 Andreas a dit :

Hello Sebastien! Did you already implement this? Main question is, how to search/replace in document? Maybe you can give me a hint

#10 Sébastien Hermann a dit :

Unfortunately, no, never done.

When you use the constructor to load your template, set the parameter keep_tpl_content to c_true to keep document content.

Then, use a new method to search/replace your string in the variable mw_docxml .
The difficulty may be that word could add lot of invisible tag INSIDE your search string. Try to type your string outside word, in notepad for example, and copy/paste into your template when everything else is good in your template, to minimize the risk.

You can look in debug the content of mw_docxml

Then, use method save to generate the modified docx file.

#11 TWIN a dit :

HI Sébastien
HOW CAN I CHANGE TEXT IN MY TEMPLATE WITH THIS CLASS

#12 Sébastien Hermann a dit :

@TWIN :
Hello,
To change a text in your template with this class, you have to define in the template the text as a variable (into word).
Then with the class, you could update the variable value :)

Écrire un commentaire

 Se rappeler de moi sur ce site

Capcha
Entrez le code de l'image :