Bonjour,
Pour la création à partir d'un modèle, il faut définir le fichier utilisé, de type xxx.ott et donc remplacé dans la ligne tUrl=".... le ".odt" par ".ott"
Théoriquement ceci devrait fonctionner.
Pour la création d'un seul document, il est possible d'utiliser la macro FusionneDocuments décrite dans le livre Programmation OpenOffice.org
 
Bon courage
 
Bruno
-----Message d'origine-----
De: Essonne Consultants [mailto:[EMAIL PROTECTED]
Date: vendredi 23 juin 2006 10:48
À: prog@fr.openoffice.org
Objet: [prog] besoin d'aide pour automatisation publipostage

Bonjour,

 

Je souhaite, à partir d'une base access piloter OO comme je le fais actuellement avec Word pour réaliser un publipostage à partir d'un modèle de document

 

J'ai modifié une macro que j'ai trouvé sur internet et j'arrive à lancer ma fusion par la commande suivante :

 

Private Sub Open_Office_Click()

                        Dim stAppName As String

                        stAppName = "C:\Program Files\OpenOffice.org 2.0\program\swriter.exe  macro:///standard.module1.macro_publipostage"

                        Call Shell(stAppName, 1)

End Sub

 

 

mais cela me génère autant de documents que d'enregistrement à fusionner (alors que je souhaiterais un document avec une page par enregistrement à fusionner).

 

Par contre je n'arrive pas à charger mon modèle, donc je charge un document existant qui est modifié lors de la fusion (remplacement des champs de fusion par les données d'un enregistrement) : voir la ligne en bleu que je souhaiterais modifier.

 

Merci de votre aide,

 

Philippe

 

Pour info ma macro :

 

Sub macro_publipostage

                                                                                  ' Dimensionnement de la valeur de retour de la fonction PubliPostage,

                                                                                  ' pour savoir si la fonction s'est bien passée

            Dim RetourValeur as long

           

                                                                                  ' Lancement de la procédure de publi-postage

            RetourValeur = Publipostage("D:/Logement/Open Office/", "test", "trt")

           

            If RetourValeur then

                                                                                  ' Si problème, on informe l'utilisateur

                        MsgBox("Un problème a eu lieu lors de la fonction PubliPostage. Vérifiez votre impression s'il vous plait.")

            endif

 

end sub

 

Function Publipostage(Chemin as string, ArgNomBase As String, ArgNomTable as String)

 

on error goto ErreurPubliPostage

 

 

Dim oDesktop As Object

Dim oDocument As Object                                                                              

dim tUrl as String                                                                                                        ' Contiendra le chemin complet du fichier modèle

Dim NoArgs() as New com.sun.star.beans.PropertyValue

Dim oDocClose

 

Dim dispatcher as Object

Dim parser as Object

Dim disp as Object

Dim url  as new com.sun.star.util.URL

Dim oFrame as Object

 

' Vérification si Chemin possède un "/" à la fin, si non, on en met un. On enlève les espaces devant/derriere.

Chemin=trim(Chemin)

If Right(Chemin,1) <>"/" then

            Chemin=Chemin+"/"

endif

 

' Connexion au service, nécessaire pour le fonctionnement de toutes les propriétés et méthodes

 oDesktop = createUnoService("com.sun.star.frame.Desktop")

 

dim oRowSet as object                                                                                    ' Equivalent d'un Dynaset, autrement dit

                                                                                                                                                         ' une "image" dynamique de la table.

dim ChaineSQL as String                                                                                             ' Chaine qui contiendra la requête SQL de chargement du RowSet

 

' Connexion au service de gestion des base de données

 oRowSet = createUnoService("com.sun.star.sdbc.RowSet")

 

' Définition de la base de données à atteindre

 oRowSet.SetPropertyValue("DataSourceName",ArgNomBase)

 

' Chargement de la chaîne contenant la requête SQL

 ChaineSQL = "select * from " + ArgNomTable

 

' Affectation de la requête SQL

 oRowSet.SetPropertyValue("Command",ChaineSQL)

 

' Exécution de la requête SQL

 oRowSet.execute

 

 'Récupération du nom des colonnes

dim mData as object                                                                                                   ' Contiendra les données du RowSet

 

dim n as integer                                                                                                         

dim NbColonnes as integer                                                                               ' Le nombre de colonnes du RowSet

 

    mData = oRowSet.getMetaData()

            NbColonnes= mData.ColumnCount

           

dim NomColonnes(NbColonnes) As String                                             ' Dimensionnement du tableau des noms de colonnes

 

   if oRowSet.RowCount > 0 then                                                                      ' S'il existe des lignes dans la table...

     oRowSet.next()

     for n=0 to NbColonnes - 1

       NomColonnes(n) = mData.getColumnName(n+1)     ' On charge le nom des colonnes (1ere ligne)

             next n

   endif

 

 'Remplissage des champs

Dim oChamps, tfm, InpFieldEnum, InpField As Object

dim NomColonneChamps as String

 

  do while not oRowset.isAfterLast                                             ' Teste si Fin de fichier (EOF) 

           

            ' Ouverture du document de la ligne d'enregistrement

            for n=0 to NbColonnes-1

                        if NomColonnes(n)="TYPCOUR" then                             ' Nom de la colonne contenant le nom du fichier modèle

                                   tUrl="file:///" + Chemin + oRowSet.getString(n+1) +".odt"

                        endif

            next n

 

            ' Chargement du document

            oDocument = oDesktop.LoadComponentFromURL(tUrl,"_blank",0,NoArgs())   ' Chargement d'un document existant, je prférerais création d'un document à partir d'un modèle ou création d'un nouveau document par copie du document existant

 

            ' Important : on charge dans oChamps tous les champs du modèle,

            ' Comprendre les champs qui peuvent être modifiés dans le document modèle.

    oChamps = oDocument.getTextFields

 

           

            ' Création d'une énumération des champs texte du modèle

            InpFieldEnum = oChamps.createEnumeration()

           

            do while InpFieldEnum.hasMoreElements                                  '

                        InpField = InpFieldEnum.nextElement()             

 

                if InpField.supportsService("com.sun.star.text.TextField.Database") then

                  tfm = InpField.getTextFieldMaster()             

    

          ' Chargement du nom du champ texte dans le modèle, pour vérification ensuite avec le nom des colonnes

          ' dans la base de données

          NomColonneChamps = InpField.getTextFieldMaster.getPropertyValue("DataColumnName")

          for n=0 to NbColonnes-1                                                 ' De la première à la dernière colonne de la base données...

            if NomColonneChamps = NomColonnes(n) then ' Le nom de la colonne est-il le nom du champ texte ?

               InpField.Content = oRowSet.getString(n+1) ' Si oui, la valeur du champ est chargée depuis la BDD

               exit for                                                                                             ' et on sort de la boucle

            endif

          next n

                        endif

    loop 

 

    oChamps.Refresh                                                                                        ' Rafraichir tous les champs du document modèle

 

oRowset.next                                                                                                              ' On passe à la ligne suivante

 loop                                                                                                                                      ' Retour case départ

 

PubliPostage=0

 

Goto FinPubliPostage

 

ErreurPubliPostage:

PubliPostage = ERR

MsgBox ("Erreur" & ERR & "." & chr$(13) & ERROR$)

 

FinPubliPostage:

End Function

 

Merci encore de votre aide,

 

Philippe

 

Répondre à