OpenXmlWord_CreateFile
Prototype : string OpenXmlWord_CreateFile(fichier)
Crée un nouveau fichier docx MS Word.
Paramètres :
1 fichier A ;nom du fichier à créer
Renvoie :
0 - si pas d'erreur
OpenXmlWord_OpenFile
Prototype : string OpenXmlWord_OpenFile(fichier)
Ouvre un fichier docx MS Word déjà éxistant
Paramètres :
1 fichier A ;nom du fichier
Renvoie :
0 - si pas d'erreur
OpenXmlWord_CloseFile
Prototype : int OpenXmlWord_CloseFile
Ferme le fichier docx en cours , les modification sont aussi sauvegardées
OpenXmlWord_CreateParagraph
Prototype : string OpenXmlWord_CreateParagraph(justif,breakdoc)
Création d’un paragraphe
Paramètres :
1 justif x = 0 ; justif 0 ou 1(à gauche) 2(centré) 3(à droite) 4(justifié)
1 breakdoc x = 0 ; 1 indique qu’il faut faire une fin de document
Renvoie :
0 - si pas d'erreur
OpenXmlWord_InsertText
Prototype : string OpenXmlWord_InsertText(texte)
Ajoute le texte dans le paragraphe en cours
Paramètres :
1 texte A ;texte
Renvoie :
0 - si pas d'erreur
OpenXmlWord_InsertFile
Prototype : int OpenXmlWord_ InsertFile(fichier, extension ,justif, breakdoc)
Changement de la taille d'une colonne (unité de mesure Excel, 10 par défaut).
Paramètres :
1 fichier A ;nom du fichier
1 extension 32 = " " ;par défaut le type de fichier est pris selon l’exention du fichier
;mais on peut définir une extension, c’est dans le cas que fichier
;contiendrais un nom de fichier temporaire, l’extension tmp n’indique
;pas le type du fichier , on peut mettre ici ‘png’ si c’est une image png
1 justif x = 0 ; justif 0 ou 1(à gauche) 2(centré) 3(à droite) 4(justifié)
1 breakdoc x = 0 ; 1 indique qu’il faut faire une fin de document
Les types de fichiers connuent sont uniquement
jpg ou jpeg ou png pour les images
Txt pour une simple suite de texte ligne à ligne
Rtf pour un fichier de type rtf
Docx pour un fichier docx MS Word
Htm ou html pour un fichier au format html
Xml pour un fichier de donnée au format xml
Renvoie :
0 - si pas d'erreur
OpenXmlWord_Replace
Prototype : int OpenXmlWord_Replace(cherche,remplace,ancrage)
Cherche et remplace un texte par un autre dans le fichier MS Word en cours
Paramètres :
1 cherche A ;chaîne à chercher
1 remplace A ;remplacer par
1 ancrage x = 0 ;création ou pas d’un nouveau paragraphe à la suite
;du paragraphe qui contiens la chaîne à chercher
; en mode sans ancrage , cette fonction renvoi le nombre de remplacement
; si ancrage = 0 ,cette fonction cherche et remplace toutes les occurences et renvoi le nombre de modifications faites
; si ancrage = 1 ,cette fonction renvoi 1 à chaque fois qu'elle rencontre la valeur 'cherche', il faut donc boucler tant que cette fonction renvoi 1
; à la fin , quand il n'y a plus de texte, le retour vaut 0
;ce mode permet de s'arrêter après chaque texte pour pouvoir insérer un fichier (cf OpenXmlWord_InsertFile , cela crée un paragraphe a la suite)
;ou pour créer paragraphe à la suite du texte (cf OpenXmlWord_CreateParagraph et OpenXmlWord_InsertText, cela crée un paragraphe a la suite )
; si ancrage = 2 ,alors le champ 'cherche' doit contenir le nom d'un champ de formulaire ou de publipostage
; le champ 'remplace' n'est pas utilisé, il n'y a pas de modification du contenu du champ formulaire ou de
;publipostage ce mode permet de s'arrêter apres un champ pour pouvoir insérer un fichier (cf OpenXmlWord_InsertFile, cela crée un paragraphe a la suite )
; ou pour créer paragraphe à la suite du texte (cf OpenXmlWord_CreateParagraph et OpenXmlWord_InsertText, cela crée un paragraphe a la suite )
1 cherche A ;texte a chercher ou nom du champ
1 remplace A ;texte de remplacement , en mode champ cette valeur n'est pas traitée
1 ancrage x = 0 ;type d'ancrage 0 1 ou 2
beginf
Renvoie :
voir selon le type d’ancrage
Exemple
OpenXml_Begin
err = OpenXmlWord_OpenFile(left(fichier))
if err = 0
trouver = OpenXmlWord_Replace("Monsieur","Texte De Remplacement",false)
do
trouver = OpenXmlWord_Replace("suitepublipostagebody","",true)
while trouver = 1
OpenXmlWord_InsertFile("c:\divalto\acrylique1.png")
;OpenXmlWord_CreateParagraph(3,0)
;OpenXmlWord_InsertText("test_remp2");
wend
do
trouver = OpenXmlWord_Replace("suitepublipostagehautdepage","",true)
while trouver = 1
OpenXmlWord_InsertFile("c:\divalto\hautdepage.jpg")
;OpenXmlWord_CreateParagraph(3,0)
;OpenXmlWord_InsertText("test_remp2");
wend
do
trouver = OpenXmlWord_Replace("suitepublipostagebasdepage","",true)
while trouver = 1
OpenXmlWord_InsertFile("c:\divalto\basdepage.png")
;OpenXmlWord_CreateParagraph(3,0)
;OpenXmlWord_InsertText("test_remp2");
wend
;do
; trouver = OpenXmlWord_Replace("suitepublipostage","",true)
;while trouver = 1
; OpenXmlWord_InsertFile("c:\divalto\ademortf.rtf")
; OpenXmlWord_InsertFile("c:\divalto\acrylique1.png")
; OpenXmlWord_InsertFile("C:\divalto\amapi_modehtml.htm")
; OpenXmlWord_InsertFile("c:\divalto\agrmservices.docx")
; OpenXmlWord_CreateParagraph(3,0)
; OpenXmlWord_InsertText("salut|sur|3ligne");
; wend
OpenXmlWord_CloseFile
endif
Exemple d’utilisation des fonctions OpenXmlWord_ dans un publipostage
procedure demopublipostage(preview)
1 preview n
beginp
surchargedebut ;avant de faire le publipostage on indique qu’on veut intervenir
;sur le fichier docx qui contiens le résultat du publipostage
;La fonction de publipostage va alors s’arrêter avant le fin du
;publipostage général afin d’intervenir sur le document final
ErreurOle = Office_Begin
if ErreurOle = 0
ErreurOle = Ouvre_DocMaitre(preview)
If ErreurOle = 0 ; Doc ouvert
Lignes_Data(1)
Lignes_Data(2)
Lignes_Data(3)
Office_MailingExecute(Champ_ListId,1,left(system.znomprog),"MessageOffice")
Office_MailingEnd ;Dans ce mode la fonction de publipostage ne fini pas
;totalement le traitement du fichier et rend la main
;pour que le programme diva puisse intervenir sur
;le document final avant de poursuivre la fin
;de la fonction de publipotage
Surchargefin ;a la fin du publipostage on met a jour le fichier et
;on redonne la main a la fonction de publipostage
;de yoffice
EndIf
Office_End
if Champ_ListId
ListDestroy(Champ_ListId)
endif
endif
endp
procedure surchargedebut
beginp
Office_MailingNoExecuteEnd ;je veux modifier le document final
endp
procedure surchargefin
1 fichier 260
1 trouver x = 0
1 err x = 0
Beginp
;je récupère le nom du fichier temporaire du document final du publipostage
fichier = Office_MailingGetFile
if fichier <> " " ;s’il y a eu un problème durant le publipostage
;la fonction renvoi un nom de fichier à espace
OpenXml_Begin ;ouverture du module openxml
err = OpenXmlWord_OpenFile(left(fichier)) ;chargement du fichier docx
if err = 0
;je boucle sur le mot clé $suitepublipostage$ car le publipostage
;peut donner lui à plusieurs fois le même document mais avec des champs
;différents
Do
;chercher le mot $suitepublipostage$ et remplacer le pas rien “”
;et crée un point d’encrage juste après le paragraphe qui
;contenait le mot clé $suitepublipostage$
trouver = OpenXmlWord_Replace("suitepublipostage","",1)
while trouver = 1
;on a trouvé $suitepublipostage$ et openxml à crée un point
;d’encrage après le paragraphe qui contenait $suitepublipostage$
;je peut alors indiquer a openxml de remplacer ce point d’encrage
;par le contenu d’un fichier rtf, ce qui me redonne un nouveau point
;d’encrage juste après le texte rtf
OpenXmlWord_InsertFile("c:\divalto\ademortf.rtf")
;je peut alors indiquer a openxml de remplacer ce point d’encrage
;par le contenu d’une image, ce qui me redonne un nouveau point
;d’encrage juste après l’image
OpenXmlWord_InsertFile("c:\divalto\acrylique1.jpg")
;je peut alors indiquer a openxml de remplacer ce point d’encrage
;par le contenu d’un fichier html
;attention il faut un fichier html dans un langage html simple comme
;par exemple une liste d'articles
;et si il contiend des images , le code de ces images doit être DANS la page
;html, on ne peut pas avoir une image de type chemin windows
;ou un lien http : … ) ,
; ce qui me redonne un nouveau point d’encrage juste après le texte
;html
OpenXmlWord_InsertFile("C:\divalto\amapi_modehtml.htm")
;idem pour un autre fichier docx
OpenXmlWord_InsertFile("c:\divalto\agrmservices.docx")
;sinon je peux me servir de ce point d’encrage pour crée un
;paragraphe et mettre du texte dedans
OpenXmlWord_CreateParagraph(0,0)
;le caractère | est remplacé par un saut de ligne
OpenXmlWord_InsertText("salut|sur|3ligne");
wend
OpenXmlWord_CloseFile
OpenXmlWord_CloseFile
endif
endif
Office_MailingEndNext
Endp
Après le publipostage
OpenXmlWord_WriteCustomDocumentPropertiesWriter
public function int OpenXmlWord_WriteCustomDocumentPropertiesWriter(prop,valeur,type)
; écriture d'une propriété custom dans un fichier docx
; renvoi 0 si pas d'erreur
1 prop A ;nom de la propriété
1 valeur A ;valeur , si c'est une date elle doit être au format AAAAMMJJ ou AAAAMMJJHHMMSS , si c'est un bouléin ce doit être 0 ou 1
1 type A ;type "Text" "Date" "Num" (num. convertie double) "Int" (num. convertie en entier) "Bool" (0 ou 1 )
1 param S
1 retour S
beginf
OpenXmlWord_WriteBuiltinDocumentPropertiesWriter
public function int OpenXmlWord_WriteBuiltinDocumentPropertiesWriter(prop,valeur)
; Ecrit une propriété standard dans le fichier docx
; avec prop => "Title" "Author" "Comments" "Keywords" "Subject"
1 prop A ;Propriété
1 valeur A ;Valeur
1 param S
1 retour S
beginf
err = OpenXmlWord_OpenFile(left(fic))
if err = 0
valeur = "xxxx"
OpenXmlWord_WriteCustomDocumentPropertiesWriter("DEROGNO",left(valeur),"Text")
OpenXmlWord_WriteBuiltinDocumentPropertiesWriter("Title","coucou c'est le titre")
OpenXmlWord_WriteBuiltinDocumentPropertiesWriter("Author","coucou c est moi")
OpenXmlWord_CloseFile
endif
OpenXmlWord_ModifyValueMaillingField
public function char OpenXmlWord_ModifyValueMaillingField(docpropertyfind,propname,propvalue)
1 docpropertyfind A ;exemple DOCPROPERTY ou MERGEFIELD
1 propname A
1 propvalue A
1 param S
1 retour S
beginf
Exemple
err = OpenXmlWord_OpenFile(left(fichierorigine))
if err = 0
valeur = "demo" & time(8)
OpenXmlWord_WriteCustomDocumentPropertiesWriter("DEROGNO",left(valeur),"Text")
valeur = "demo" & time(7)
OpenXmlWord_WriteCustomDocumentPropertiesWriter("DEROGIDENT",left(valeur),"Text")
OpenXmlWord_CloseFile
endif
OpenXml_End
Mais attention : cela change que la propriété du document word , mais certaines propriétés peuvent être réutilisées dans le documents, ce qui n'est pas le cas de la majorité des propriétés
par exemple ici , c'est le cas ici
Si vous avez des propriétés susceptibles d'être aussi dans le document alors il faut aussi ajouter la recherche et le remplacement de ces propriétés de type DOCPPOPERTY dans tout le document
valeur = "demo" & time(8)
OpenXmlWord_WriteCustomDocumentPropertiesWriter("DEROGNO",left(valeur),"Text")
retour = OpenXmlWord_ModifyValueMaillingField("DOCPROPERTY","DEROGNO",left(valeur))
valeur = "demo" & time(7)
OpenXmlWord_WriteCustomDocumentPropertiesWriter("DEROGIDENT",left(valeur),"Text")
retour = OpenXmlWord_ModifyValueMaillingField("DOCPROPERTY","DEROGIDENT",left(valeur))