PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → MailMerge WinWord/OpenOffice
MailMerge WinWord/OpenOffice
Débuté par marc.codron, 04 nov. 2005 12:43 - 4 réponses
Posté le 04 novembre 2005 - 12:43
Bonjour,

Existe t il une équivalence sur le dialogue OLE de WinWord
dans OpenOffice (V2) en ce qui concerne la FusionPublipostage.


//----- Instruction MailMerge d’une source de données texte par exemple
//----- vers un nouveau document depuis un modèle.
w_word_mail>>ActiveDocument>>MailMerge>>Destination = 0
w_word_mail>>ActiveDocument>>MailMerge>>Execute(OLEFaux)

j’ai cherché du côté de l’Assistant Mailing d’OpenOffice et des macros
mais sans succès.

Objet.executeDispatch(document, ".uno:MailMergeWizard", "", 0, Array())
Posté le 04 novembre 2005 - 17:40
Marc a écrit :
Bonjour,

Existe t il une équivalence sur le dialogue OLE de WinWord
dans OpenOffice (V2) en ce qui concerne la FusionPublipostage.


//----- Instruction MailMerge d’une source de données texte par exemple
//----- vers un nouveau document depuis un modèle.
w_word_mail>>ActiveDocument>>MailMerge>>Destination = 0
w_word_mail>>ActiveDocument>>MailMerge>>Execute(OLEFaux)

j’ai cherché du côté de l’Assistant Mailing d’OpenOffice et des macros
mais sans succès.

Objet.executeDispatch(document, ".uno:MailMergeWizard", "", 0, Array())



Ca existe !!
J'avais posté du code OLE qui permetait :
- de créer ou d'ouvrir un document.
- de créer une source de donnée.
- d'associer les 2
- de lancer le publipostage

Le seul point qui pose problème est l'ajout programmé de champ de
liaison dans le document (les zones remplacés)
J'ai plus ou moins délaissé mon code depuis mes derniers essais.
Donc je ne sait pas si mon code est compatible OOo 2.0 ou si quelqu'un a
trouvé une solution a l'ajout de champs de fusion.

a++
Goof

PS : ecrit moi si tu ne retrouve pas le post, je peut te redonner mes
quelques lignes de code.
PS2 : si tu trouve une solution ca m'interesse aussi.
Posté le 07 novembre 2005 - 10:06
Avez vous solutionné l'utilisation de la commande PropertyValue . ??

Pour par exemple ouvrir un document en mode invisible ou en lecture seule ....

J'ai essayé d'utiliser des tableux de variants des tableuax d'objets ole dynamique .. impossible de faire fonctionner la commande !

Merci d'avance ...

le code de publipostage m'interesses aussi ... je suis entrain de créer une classe complète pour l'utilisation de Lole avec Writer et Calc ... je pourrais la mettre a votre disposition ensuite ...
Posté le 07 novembre 2005 - 17:19
Ok Goof, je veux bien tes lignes de code afin que je puisse les
tester en V2 et connaitre ta syntaxe sur le lancement de la fusion.
En effet en version 2, la fusion à bien évoluée.
La fusion est visuelle et le résultat est dans un seul et un même document (idem Winword).
Merci par avance, je continu mes tests et vous tiens informés
si je trouve des solutions.

@+
Posté le 08 novembre 2005 - 10:33
Marc a écrit :
Ok Goof, je veux bien tes lignes de code afin que je puisse les
tester en V2 et connaitre ta syntaxe sur le lancement de la fusion.
En effet en version 2, la fusion à bien évoluée.
La fusion est visuelle et le résultat est dans un seul et un même document (idem Winword).
Merci par avance, je continu mes tests et vous tiens informés
si je trouve des solutions.

@+

Voila le code.
on doit générer un fichier texte csv compatible avec le moteur de donnée
de OOo.


----------Initialisation de ma fenêtre--------------
Document_OOo est un Automation dynamique
Appli_OOo est un Automation dynamique
Traitement_de_texte_OOo est un Automation dynamique
FenEtat(PUBLI_OOo,DessusTout)
QUAND EXCEPTION
Info("Erreur dans le publipostage.")
Ferme
FIN
----------------------------------------------------

S_Fichier est un champ contenant le nom d'un document a ouvrir.
Si ce champ est vide on crée un nouveau document.
--------------- Bouton lancer OOo ------------------
t_Var_1 is array of 0 Variants
appli_OoO=GetActiveObject("com.sun.star.ServiceManager")
// recuperation d'une instance en cours de openoffice
IF Appli_OOo=Null THEN
Appli_OOo = new object Automation "com.sun.star.ServiceManager"
IF Appli_OOo=Null THEN
Info("OpenOffice.org n'est pas démarré ou installé.")
RETURN
END
END
Traitement_de_texte_OOo =
Appli_OOo>>createInstance("com.sun.star.frame.Desktop")
IF Traitement_de_texte_OOo=Null THEN
Info("Impossible de démarrer OpenOffice.org")
RETURN
END
IF S_Fichier<>"" THEN
// ouverture d'un fichier existant
Document_OOo =
Traitement_de_texte_OOo>>loadComponentFromURL("file:///"+Replace(S_Fichier,"\","/"),
"_blank", 0,t_Var_1)
IF Document_OOo=Null THEN Info("Impossible d'ouvrir le document.")
ELSE
// création d'un nouveau document.
Document_OOo =
Traitement_de_texte_OOo>>loadComponentFromURL("private:factory/swriter",
"_blank", 0,t_Var_1);
IF Document_OOo=Null THEN Info("Impossible de créer un nouveau document")
END
-----------------------------------------------------

ce bouton permet d'insérer du texte. Mais OOo ne gére pas ses champs
comme du texte, a l'inverse de MS Word.
Liste1 contient des nom 'Humanoide' de champs avec un glien vers le nom
'Informatique' du champ dans le fichier de donnée
------------------ bouton insérer -------------------
objText est Automation dynamique
SI Document_OOo=Null ALORS
Info("Aucun document n'est ouvert")
RETOUR
FIN
objText = Document_OOo>>Text()
objText>>insertString(Document_OOo>>CurrentController>>ViewCursor, "
<"+Liste1[Liste1]..Valeur+"> ", OLEFaux)
------------------------------------------------------

------------- Bouton Lancer le publipostage ----------
b_temp est booléen
Sdb_Access est Automation dynamique
OOo_db est Automation dynamique
S_fichier_temp est chaîne
Temp est tableau de 0 Variant
Mail_Merge est Automation dynamique

// on verifie que le document est ouvert.
SI Document_OOo=Null ALORS
Info("Impossible de créer un nouveau document")
RETOUR
FIN

// Création de la source de donnée si elle n'existe pas
Sdb_Access = Appli_OOo>>createInstance("com.sun.star.sdb.DatabaseContext")
b_temp=Sdb_Access>>hasByName("EDTPERSO")
SI b_temp = Faux ALORS
OOo_db = Sdb_Access>>createInstance()
// ici on met le nom du fichier texte contenant les données
OOo_db>>setPropertyValue("URL", "sdbc:flat:file:///C:/data.txt")
// Il y a peut-être d'autres paramètres a renseigner.
// mais je n'ai pas pu tester.
// enregistrement de la source de donnée. (ca marche)
Sdb_Access>>registerObject("EDTPERSO", OOo_db);
FIN

// on enregistre dans un fichier temporaire pour effectuer la fusion.
// (extension a verifier pour OOo 2)
S_fichier_temp="file:///"+Remplace(fRépertoireTemp()+"edtperso\"+fExtraitChemin(fFichierTemp(),fFichier)+".sxw","\","/")
Document_OOo>>storeToURL(S_fichier_temp,Temp)
// on instancie le mail merger et on le paramètre.
Mail_Merge = Appli_OOo>>createInstance( "com.sun.star.text.MailMerge" )
Mail_Merge>>DataSourceName="EDTPERSO"
Mail_Merge>>DocumentURL=S_fichier_temp
Mail_Merge>>CommandType=0 //' Find the fields in a db table
Mail_Merge>>Command="FUSION"
Mail_Merge>>OutputType=1
// on lance la fusion
Mail_Merge>>Exécute(Temp)
Info("Fusion terminée")
---------------------------------------------------------