Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fusions avec open office : fin ?

12 réponses
Avatar
Jacques TREPP
Bonjour,

j'ai avancé dans mes recherches de fusions avec open office writer. En gros,
outre les fonctions de l'exemple de windev, je peux maintenant exporter en
pdf, enregistrer sous le format word. Il me manque une routine pour exécuter
des macros, pour pouvoir réellement donner une alternative à mes clients.

J'ai essayé la chose suivante :
enregistrement d'une macro qui insère une en tête . cette macro s'appelle
entete (original, non ?) et voici son code :
sub entete
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "PageStyle"
args1(0).Value = "Standard"
args1(1).Name = "On"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:InsertPageHeader", "", 0,
args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = "AVOWIN_V10"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())
end sub

la macro s'exécute normalement si je dis Outils..Macros..Executer..entete.

j'enregistre une nouvelle macro, nommée 'lancemacro', dans laquelle
j'exécute la macro 'entete'.
voici son code :

sub lancemacro
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:RunMacro", "", 0, Array())
end sub

je ne trouve nulle part de référence à la macro 'entete'. Il semblerait que
lorsque je lance la macro 'lancemacro', il me demande où se trouve la macro
'entete'. Si je lui donne le chemin (mes macros..standard..module1) ça
exécute bien la macro 'entete'.
ce qui ne me sert strictement à rien. :(
Est-ce que vous avez des éléments concernant ces maniplations ?
si oui, bienvenue ! ;)

merci

PS : je vais voir si je peux utiliser des boutons pour faire ça.
--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)

10 réponses

1 2
Avatar
Pierre BOUSQUET
merci pour ce partage !

Après mûre réflexion, Jacques TREPP a écrit :
Bonjour,

j'ai avancé dans mes recherches de fusions avec open office writer. En gros,
outre les fonctions de l'exemple de windev, je peux maintenant exporter en
pdf, enregistrer sous le format word. Il me manque une routine pour exécuter
des macros, pour pouvoir réellement donner une alternative à mes clients.

J'ai essayé la chose suivante :
enregistrement d'une macro qui insère une en tête . cette macro s'appelle
entete (original, non ?) et voici son code :
sub entete
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "PageStyle"
args1(0).Value = "Standard"
args1(1).Name = "On"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:InsertPageHeader", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = "AVOWIN_V10"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())
end sub

la macro s'exécute normalement si je dis Outils..Macros..Executer..entete.

j'enregistre une nouvelle macro, nommée 'lancemacro', dans laquelle j'exécute
la macro 'entete'.
voici son code :

sub lancemacro
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:RunMacro", "", 0, Array())
end sub

je ne trouve nulle part de référence à la macro 'entete'. Il semblerait que
lorsque je lance la macro 'lancemacro', il me demande où se trouve la macro
'entete'. Si je lui donne le chemin (mes macros..standard..module1) ça
exécute bien la macro 'entete'.
ce qui ne me sert strictement à rien. :(
Est-ce que vous avez des éléments concernant ces maniplations ?
si oui, bienvenue ! ;)

merci

PS : je vais voir si je peux utiliser des boutons pour faire ça.



--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
Avatar
Jacques TREPP
"Pierre BOUSQUET" a écrit dans le message de
news:
merci pour ce partage !




Sans problème. J'ai encore avancé. Ma macro fonctionne dans open office. Par
contre, j'ai un problème à la traduction de la fonction Array().
Comme les codes sont très courts, je vous livre les 2 :
macro OOffice :
dim document as object
dim dispatcher as object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dispatcher.executeDispatch(document,
"macro://test/Standard.Module1.entete()", "", 0, Array())

// pour exécuter la macro entete dans le document test. ça, ça fonctionne.

la méthode Exécute_Macro (pas Cauet)
Document est un objet OLE dynamique
dispatcher est un objet OLE dynamique

Document = :oDocument>>CurrentController>>Frame
m_array est un Variant = 10 // j'ai mis n'importe quoi

dispatcher =
:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")

dispatcher>>executeDispatch(Document,"macro;//test/Standard.Module1.entete()",
"",0,m_array)
ça, ça plante à cause de Array que je ne sais pas traduire.

Merci pour tout

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Jacques TREPP
Bonsoir,

ja m'auto répond. la syntaxe suivante de plante pas. elle ne fait rien non
plus ! :)

PROCEDURE Exécute_Macro(NomMacro="entete")

Document est un objet OLE dynamique
dispatcher est un objet OLE dynamique

Document = :oDocument>>CurrentController>>Frame

m_array est un tableau de 0 Variant

dispatcher =
:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")

dispatcher>>executeDispatch(Document,"macro;//test/Standard.Module1.entete()",
"",0,m_array)

ça doit être dans le rattachement de la macro. J'avoue que j'ai du mal avec
ça par rapport à word. En fait, j'ai un modèle qui contient toutes les
macros.
Lorsque j'ouvre word, j'associe mon modèle. 2 avantages :
le modèle est sur le serveur, donc accessible à tous.
le modèle étant associe, l'utilisateur ne peut pas me pourrir mes macros à
moi !

J'aimerais bien faire ça avec OO.

cordialement

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Jacques TREPP
Bonjour,

Bon : a y est ! Pour faire simple : c'est quelquefois un peu galère de
discuter avec open office. malgré tout, j'ai résolu mon problème de macros
... en ligne de commande.
je me sers de la classe WdDos qui trainait sur ma machine, et que j'avais
oublié jusqu'à il y a 3 jours, où je l'ai envoyé à un abonné au forum.
Voici le code :
PROCEDURE Exécute_Macro(NomMacro="entete")
macomm est une chaîne
macomm = Caract(34)+"C:Program FilesOpenOffice.org
2.2programsoffice.exe"+Caract(34)...
+" -invisible
"+Caract(34)+"macro:///Standard.Module1."+NomMacro+"()"+Caract(34)
CMDos:CommandLine_Let(macomm)
CMDos:ExecuteCommand()

D'aucuns pourront dire que c'est un tantinet "bourrin". de man fou :
j'assume ;)
En résumé, en plus des fonctions des classes CDocument et cOpenOffice
fournies par Pc-Soft, j'ai ajouté les fonctions suivantes, dont je me fais
une joie de vous donner le code :
executions de macros : voir ci-dessus

enregistrer un .ODT au format MsWord :
PROCEDURE Enregistrer_Sous_MsWord(NomDocumentDoc)

Document est un objet OLE dynamique
dispatcher est un objet OLE dynamique

Document = :oDocument>>CurrentController>>Frame
dispatcher =
:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")
ParamImpression est un tableau de 3 objet Automation dynamique

// Exporter en DOC
ParamImpression[1] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ParamImpression[1]>>Name = "URL"
ParamImpression[1]>>Value = NomDocumentDoc
ParamImpression[2] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ParamImpression[2]>>Name = "FilterName"
ParamImpression[2]>>Value = "MS Word 97"
ParamImpression[3] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ParamImpression[3]>>Name = "SelectionOnly"
ParamImpression[3]>>Value = True
dispatcher>>executeDispatch(Document,".uno:SaveAs", "",0,ParamImpression)

Changement d'imprimante (pour PDFCreator, par exemple)
PROCEDURE Changer_imprimante(NomPrinter)

Document est un objet OLE dynamique

dispatcher est un objet OLE dynamique

ParamImpression est un tableau de 1 objet Automation dynamique

dispatcher =
:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")

Document = :oDocument>>CurrentController>>Frame

// Changement de l'imprimante
ParamImpression[1] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")

ParamImpression[1]>>Name = "Printer"
ParamImpression[1]>>Value = NomPrinter

dispatcher>>executeDispatch(Document,".uno:Printer", "",0,ParamImpression)


Exportation en PDF
PROCEDURE Export_PDF(NomDocument)

Document est un objet OLE dynamique
dispatcher est un objet OLE dynamique

Document = :oDocument>>CurrentController>>Frame
dispatcher =
:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")

ParamImpression est un tableau de 3 objet Automation dynamique
machaine est une chaîne

// Exporter en PDF
ParamImpression[1] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ParamImpression[1]>>Name = "URL"
ParamImpression[1]>>Value = NomDocument

ParamImpression[2] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ParamImpression[2]>>Name = "FilterName"
ParamImpression[2]>>Value = "writer_pdf_Export"


ParamImpression[3] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
ParamImpression[3]>>Name = "SelectionOnly"
ParamImpression[3]>>Value = True

dispatcher>>executeDispatch(Document,".uno:ExportDirectToPDF",
"",0,ParamImpression)


ENJOY ! :)

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Bruno
Bonjour,

Dans Oo, je cherche à ouvrir un document en caché, tu as ça dans tes
fonctions ?


Merci

Jacques TREPP vient de nous annoncer :
Bonsoir,

ja m'auto répond. la syntaxe suivante de plante pas. elle ne fait rien non
plus ! :)

PROCEDURE Exécute_Macro(NomMacro="entete")

Document est un objet OLE dynamique
dispatcher est un objet OLE dynamique

Document = :oDocument>>CurrentController>>Frame

m_array est un tableau de 0 Variant

dispatcher > :oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")

dispatcher>>executeDispatch(Document,"macro;//test/Standard.Module1.entete()",
"",0,m_array)

ça doit être dans le rattachement de la macro. J'avoue que j'ai du mal avec
ça par rapport à word. En fait, j'ai un modèle qui contient toutes les
macros.
Lorsque j'ouvre word, j'associe mon modèle. 2 avantages :
le modèle est sur le serveur, donc accessible à tous.
le modèle étant associe, l'utilisateur ne peut pas me pourrir mes macros à
moi !

J'aimerais bien faire ça avec OO.

cordialement



--
Bruno A

suivre ce lien pour répondre :
http://cerbermail.com/?TF4s3h4ejs
;)
Avatar
Jacques TREPP
"Bruno" a écrit dans le message de
news:
Bonjour,

Dans Oo, je cherche à ouvrir un document en caché, tu as ça dans tes
fonctions ?





Bonjour Bruno,
Pour l'ouverture, je me sers de la classe de pc-soft :
:oDocument = :oDesktop>>LoadComponentFromURL(sCheminFormaté, "_blank", 0,
mNoArgs)
A mon avis, ça doit se trouver dans le mNoArgs.

Sinon, regarde dans le message où j'ai donné le code des méthodes que j'ai
ajoutées. Dans l'exécution de macro, il y a une ligne de commande avec une
option -invisible que pourrais utiliser en remplaçant la commande "macro"
par un équivalent de "open".

c'est ballot : tu aurais pu me demander un truc que j'avais fait. ;)

désolé.

PS si tu trouves, par contre, ça m'intéresse ! :D



--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Bruno
Jacques TREPP a écrit :
"Bruno" a écrit dans le message de
news:
Bonjour,

Dans Oo, je cherche à ouvrir un document en caché, tu as ça dans tes
fonctions ?







C'est bon d'après tes exemples pour l'imprimante, j'ai pu créer ce
fameux tableau mNoArgs avec l'argument "Hidden". Dans mes recherches
j'étais pas loin mais il me manquait la déclaration du tableau + la
récupération avec Bridge_GetStruct.

Merci

Bruno

Bonjour Bruno,
Pour l'ouverture, je me sers de la classe de pc-soft :
>oDocument = :oDesktop>>LoadComponentFromURL(sCheminFormaté, "_blank", 0,
mNoArgs)
A mon avis, ça doit se trouver dans le mNoArgs.

Sinon, regarde dans le message où j'ai donné le code des méthodes que j'ai
ajoutées. Dans l'exécution de macro, il y a une ligne de commande avec une
option -invisible que pourrais utiliser en remplaçant la commande "macro" par
un équivalent de "open".

c'est ballot : tu aurais pu me demander un truc que j'avais fait. ;)

désolé.

PS si tu trouves, par contre, ça m'intéresse ! :D



--
Bruno A

suivre ce lien pour répondre :
http://cerbermail.com/?TF4s3h4ejs
;)
Avatar
Bruno
>
PS si tu trouves, par contre, ça m'intéresse ! :D



Et voilà le code

sCheminFormaté est une chaîne
ldispatcher est un objet OLE dynamique

// Service manager nécessaire à OpenOffice
:DémarrerService()

OPropertyValue est un tableau de 1 objet automation dynamique
ldispatcher
=:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")
//
OPropertyValue[1] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oPropertyValue[1]>>Name = "Hidden"
oPropertyValue[1]>>Value = true
//


SI fFichierExiste(psCheminComplet) ALORS

// Formatage du chemin du fichier
sCheminFormaté = "file:///"+Remplace(psCheminComplet,"","/")

// Ouverture du fichier dans OpenOffice Writer
:oDocument = :oDesktop>>LoadComponentFromURL(sCheminFormaté, "_blank",
0, OPropertyValue)

SI :oDocument<>Null ALORS
RENVOYER Vrai
FIN
FIN

RENVOYER Faux

--
Bruno A

suivre ce lien pour répondre :
http://cerbermail.com/?TF4s3h4ejs
;)
Avatar
Jacques TREPP
"Bruno" a écrit dans le message de
news:
>
PS si tu trouves, par contre, ça m'intéresse ! :D



Et voilà le code

sCheminFormaté est une chaîne
ldispatcher est un objet OLE dynamique

// Service manager nécessaire à OpenOffice
:DémarrerService()

OPropertyValue est un tableau de 1 objet automation dynamique
ldispatcher
=:oServiceManager>>createInstance("com.sun.star.frame.DispatchHelper")
//
OPropertyValue[1] =
:oServiceManager>>Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oPropertyValue[1]>>Name = "Hidden"
oPropertyValue[1]>>Value = true
//


SI fFichierExiste(psCheminComplet) ALORS

// Formatage du chemin du fichier
sCheminFormaté = "file:///"+Remplace(psCheminComplet,"","/")

// Ouverture du fichier dans OpenOffice Writer
:oDocument = :oDesktop>>LoadComponentFromURL(sCheminFormaté, "_blank", 0,
OPropertyValue)

SI :oDocument<>Null ALORS
RENVOYER Vrai
FIN
FIN

RENVOYER Faux

--
Bruno A




Merci Bruno !
je vais intégrer ça dans ma classe "remaniée". En clair, je dois pouvoir
ouvrir un document, effectuer une fution et l'imprimer sans apercevoir open
office ?
C'est intéressant.

--
Jacques TREPP
Albygest
3, rue Jean Mermoz
81160 ST-JUERY
(enlevez 'pasdespam' pour me joindre)
Avatar
Bruno
C'est le but en effet.

Jacques TREPP a écrit :

Merci Bruno !
je vais intégrer ça dans ma classe "remaniée". En clair, je dois pouvoir
ouvrir un document, effectuer une fution et l'imprimer sans apercevoir open
office ?
C'est intéressant.



--
Bruno A

suivre ce lien pour répondre :
http://cerbermail.com/?TF4s3h4ejs
;)
1 2