Aller au contenu

ecrire dans libre office writer


Messages recommandés

Posté(e)

Bonjour à tous

 

Suite à mon dernier post, peux t-on de la même facon que calc sous libre office, écrire depuis Autocad via un lisp dans writer de libre office ?

 

je pense qu'en modifiant légérement les fonctions ci-dessous de vincentp010 (que je remercie d'ailleurs sincérement), on pourrait y arriver, ce code est utilisé pour ouvrir un fichier calc de libre office

 

(defun init-oo (/ oo-des openPar obj feu)
 (setq oo-app (vlax-create-object "com.sun.star.ServiceManager"))
 (setq oo-des (vl-catch-all-apply 'vlax-invoke (list oo-app 'createinstance "com.sun.star.frame.Desktop")))
 (setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 2)))
 (setq obj (vlax-invoke-method oo-des 'loadComponentFromURL "private:factory/scalc" "_blank" 0 openPar))
 ;liste des feuilles
 (setq feu (vl-catch-all-apply 'vlax-get (list obj 'sheets)))
 ;feuille 1 par defaut
 (setq tro (vlax-invoke feu 'getbyindex 0))
 (vl-catch-all-apply 'vlax-invoke (list (vlax-get obj 'CurrentController) 'SetActiveSheet tro))
)


(defun write-cel (name x)
 (setq cel (vl-catch-all-apply 'vlax-invoke (list tro 'getCellRangeByName name)))
 (vl-catch-all-apply 'vlax-put (list 
   cel 
   (if (numberp (read x)) 'value 'string)
   (if (numberp (read x)) (vl-string-subst "," "." x) x)
 ))
)

 

sachant qu'à l'époque j'avais déjà programmé sous Word un petit truc et j'avais utilisé la commande vlax-dump-objet je crois pour voir les différentes méthodes disponibles pour la mise en page

si vous avez quelques exemples, je suis preneur

le but étant de pouvoir écrire le contenu/index de plusieurs textes sous Autocad dans libre office writer directement

 

Merci par avance pour vos réponses

John

Posté(e)

Bonjour à tous

 

Patrick si tu me lis,

j'ai cherché de mon côté à avancer,

j'ai repéré aussi cette discussion pour trouver des solutions lisp pour Word

 

en utilisant ce code, j'arrive à ouvrir un fichier writer vierge

 

(defun init-oo-writer (/ oo-des openPar obj)
 (setq oo-app (vlax-create-object "com.sun.star.ServiceManager"))
 (setq oo-des (vl-catch-all-apply 'vlax-invoke (list oo-app 'createinstance "com.sun.star.frame.Desktop")))
 (setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 2)))
 (setq obj (vlax-invoke-method oo-des 'loadComponentFromURL "private:factory/swriter" "_blank" 0 openPar))
)

(init-oo-writer)

 

par contre, je n'arrive pas à trouver le moyen de récupérer le curseur pour

écrire les textes qui m’intéressent dans le fichier vierge, ou même la variable du nouveau document afficher à l'écran

 

je n'arrive pas non plus à voir les méthodes associés avec la commande (vlax-dump-object xxx T)

si vous avez des idées je suis preneur

l'idéal serait les mêmes exemples que dans le post Word et après je me débrouille

Merci par avance

John

Posté(e)

Salut

 

A partir du lien que j'avais donné.

 

(setq oo-app (vlax-create-object "com.sun.star.ServiceManager"))
(setq oo-des (vlax-invoke oo-app 'createinstance "com.sun.star.frame.Desktop"))
(setq oo-doc (vlax-invoke-method oo-des 'loadComponentFromURL "private:factory/swriter" "_blank" 0 (vlax-make-safearray vlax-vbVariant '(0 . 2))))

 

Objet Texte du document oOo

; Traduction de : Set objText= objDocument.getText
(setq oo-txt (vlax-invoke oo-doc 'getText))

Objet Curseur Texte du document oOo

; Traduction de : Set objCursor= objText.createTextCursor
(setq oo-obj (vlax-invoke oo-txt 'createTextCursor))

Ecrire la première ligne

; Traduction de : objText.insertString objCursor, "The first line in the newly created text document." & vbLf, false
(vlax-invoke-method oo-txt 'insertString oo-obj (strcat  "The first line in the newly created text document." (chr 10)) :vlax-false)

Ecrire la seconde ligne

; Traduction de : objText.insertString objCursor, "Now we're in the second line", false
(vlax-invoke-method oo-txt 'insertString oo-obj "Now we're in the second line" :vlax-false)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour Patrick

 

les trois lignes de ta réponse précédentes m'ont vraiment aidé à avancer sur mon lisp

le paramètre Chr10 sert pour les sauts de lignes

 

j'ai insérer des sauts de paragraphes avec

(vlax-invoke-method oo-txt 'insertControlCharacter oo-obj 0 :vlax-false)

qui permet de conserver les propriétés d'un paragraphe sans modifier tout le document

j'arrive à écrire ce que je veux dans mon fichier writer de libre office mais la mise en forme est à revoir

 

je n'ai pas par exemple trouver le moyen de modifier le style de texte, la taille du texte, la couleur du texte

et de pouvoir insérer un tableau par exemple de 4 lignes et de 4 colonnes

 

pour la couleur, j'ai essayé cela sans succés

(vlax-invoke-method oo-txt 'setPropertyValue oo-obj "CharColor" "255")

 

pour le tableau, sans succès non plus

(setq oo-tabl (vlax-invoke oo-doc 'createInstance( "com.sun.star.text.TextTable")))
(vlax-invoke-method oo-tabl 'initialize 4, 4)
(vlax-invoke-method oo-txt 'insertTextContent oo-obj, oo-tabl :vlax-false)

 

j'ai essayé de prendre exemples sur ton code lisp mais rien n'y fait, avec ou sans virgule....

Merci encore de ton aide

John

Posté(e)

Bonjour Patrick

 

les trois lignes de ta réponse précédentes m'ont vraiment aidé à avancer sur mon lisp

le paramètre Chr10 sert pour les sauts de lignes

 

j'ai insérer des sauts de paragraphes avec

(vlax-invoke-method oo-txt 'insertControlCharacter oo-obj 0 :vlax-false)

qui permet de conserver les propriétés d'un paragraphe sans modifier tout le document

j'arrive à écrire ce que je veux dans mon fichier writer de libre office mais la mise en forme est à revoir

 

je n'ai pas par exemple trouver le moyen de modifier le style de texte, la taille du texte, la couleur du texte

et de pouvoir insérer un tableau par exemple de 4 lignes et de 4 colonnes

 

pour la couleur, j'ai essayé cela sans succés

(vlax-invoke-method oo-txt 'setPropertyValue oo-obj "CharColor" "255")

 

pour le tableau, sans succès non plus

(setq oo-tabl (vlax-invoke oo-doc 'createInstance( "com.sun.star.text.TextTable")))
(vlax-invoke-method oo-tabl 'initialize 4, 4)
(vlax-invoke-method oo-txt 'insertTextContent oo-obj, oo-tabl :vlax-false)

 

j'ai essayé de prendre exemples sur ton code lisp mais rien n'y fait, avec ou sans virgule....

Merci encore de ton aide

John

Posté(e)

il fautdrait aussi si possible trouver le moyen d'ouvrir un fichier modèle au démarrage du lisp,

je sais écrire quelques lignes lisp mais là ca dépasse vraiment mes compétences

merci

John

Posté(e)

petite avancée microbienne, en recherchant un peu sur le net

 

pour le style du cursor, il doit falloir utiliser quelque chose du style

 

;; pour la taille du texte
(vlax-invoke-method oo-txt 'setPropertyValue oo-obj CharHeight "14")

;; pour le style de texte
(vlax-invoke-method oo-txt 'setPropertyValue oo-obj CharFontName "Arial")

;; pour l'alignement du texte
(vlax-invoke-method oo-txt 'setPropertyValue oo-obj Alignment "Right")

;; pour la couleur du texte
(vlax-invoke-method oo-txt 'setPropertyValue oo-obj CharColor "1")

 

si vous avez des idées, merci

John

Posté(e)

Salut

 

Pour ce qui est du type, de la taille ou de la couleur du texte, cela a été relativement facile de mettre la main dessus.

 

Changer la police de caractères en Arial

(vlax-put oo-obj 'CharFontName "Arial")

 

Changer la couleur du texte en rouge

(vlax-put oo-obj 'CharColor 16724787)

 

Récupérer la couleur du texte sélectionné

(vlax-get oo-obj 'CharColor)

 

Changer la taille du texte en 14

(vlax-put oo-obj 'CharHeight 14)

 

Par contre, pour un tableau, cela semble être plus compliqué. Je continue de chercher.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci Patrick pour ces quelques lignes, qui changent la vie et évite de tout se taper à la main comme avant

n'aurais tu pas par hasard aussi la commande pour l'alignement gauche droite ou centré ?

et le tableau, je vais essayer de mon côté aussi

 

merci encore

john

Posté(e)

Voilà pour le tableau.

J'ai pas les yeux en face des trous ce matin car je m'acharnais sur une erreur. Le tout est de trouver

 

Pour le tableau

; Création du tableau
(setq oo-tbl (vlax-invoke oo-doc 'createinstance "com.sun.star.text.TextTable"))
(vlax-invoke-method oo-tbl 'initialize 4 4) ; 4 Lignes et 4 Colonnes
(vlax-invoke-method oo-txt 'insertTextContent oo-obj oo-tbl :vlax-false)

; Pour écrire TEST A1 dans la 1er cellule
(setq oo-cel (vlax-invoke oo-tbl 'getCellByPosition 0 0)) ; Ligne 1, Colonne 1 ou A1
(setq oo-cel-txt (vlax-invoke oo-cel 'getText))
(setq oo-cel-obj (vlax-invoke oo-cel-txt 'createTextCursor))
(vlax-invoke oo-cel-txt 'insertString oo-cel-obj "TEST A1" :vlax-false)

 

Je vais déjeuner et je regarde pour les alignements.

 

Un Lien à regarder.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Ce que j'ai pu trouver

 

; Alignement
(vlax-put oo-obj 'paraAdjust 0) ; Gauche
(vlax-put oo-obj 'paraAdjust 1) ; Droite
(vlax-put oo-obj 'paraAdjust 2) ; Paragraphe
(vlax-put oo-obj 'paraAdjust 3) ; Millieu

(vlax-put oo-obj 'CharPosture 0) ; Ecriture normal
(vlax-put oo-obj 'CharPosture 1) ; Ecriture italique

(vlax-put oo-obj 'CharUnderline 0) ; Ne pas sousligner
(vlax-put oo-obj 'CharUnderline 1) ; Souligner

(vlax-put oo-obj 'CharWeight 0) ; Ne plus être en gras
(vlax-put oo-obj 'CharWeight 150) ; Gras (de 111 à 200)

(vlax-put oo-obj 'CharBackcolor 16000) ; Couleur fond du texte

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut

 

J'ai continué de chercher un peu, notamment pour dimensionner le tableau

; Pour modifier les bords gauche et droite
(vlax-put oo-tbl 'HoriOrient 0)
(vlax-put oo-tbl 'RightMargin 2000)
(vlax-put oo-tbl 'LeftMargin 2000)

;Pour modifier la largeur de la 1er et 2em colonne
(setq oo-sep (vlax-get oo-tbl 'TableColumnSeparators))
(vlax-put (nth 0 oo-sep) 'Position 2000)
(vlax-put (nth 1 oo-sep) 'Position 4000)
(vlax-put oo-tbl 'TableColumnSeparators oo-sep)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 2 semaines après...
Posté(e)

Salut

Merci Patrick pour ces réponses

j'ai mis du temps à répondre car j'étais débordé ces derniers jours

j'ai terminé mon lisp de création de rapport automatique, tout marche nickel et la mise en page se fait toute seule

il me manque juste de pouvoir insérer une en-tête et un pied de page ou sinon d'ouvrir à l'ouverture de swriter un document type extension .ott

 

John

Posté(e)

Salut Patrick

j'ai essayé de remplacer dans la fonction le terme _blank par le chemin de mon modèle.ott mais rien n'y fait

 

(defun init-oo-writer (/ oo-des openPar)
(setq oo-app (vlax-create-object "com.sun.star.ServiceManager"))
(setq oo-des (vlax-invoke oo-app 'createinstance "com.sun.star.frame.Desktop"))
(setq oo-doc (vlax-invoke-method oo-des 'loadComponentFromURL "private:factory/swriter" "C:\\Users\\Utilisateur\\Desktop\\modele.ott" 0 (vlax-make-safearray vlax-vbVariant '(0 . 2))))
)

 

si vous avez des idées

Merci

John

Posté(e)

Salut

 

Une fonction reprise depuis Api_xls

;-------------------------------------------------------------------
;
; Convertir une chaine de caractères de type UTF-8
; Convert a string to UTF-8
;
; Exemple
; (decodeurl "c:\\Donn%C3%A9es") --> "c:\\Données"
;
;-------------------------------------------------------------------
(defun decodeurl(str / hex new pos txt hexdec)

 (defun hexdec (nb / r i s) 
   (if (= (type nb) 'INT)
     (setq nb (itoa nb))
   )
   (setq r 0 i 0)
   (while (and (= (type nb) 'STR) (< i (strlen nb)))
     (setq i (1+ i)
    s (strcase (substr nb i 1 ))
    r (+ (lsh r 4) (- (ascii s) (if (<= s "9") 48 55)))
     )
   )
 )

 (while (setq pos (vl-string-search "%" str))
   (setq hex (substr str (+ pos 2) 2))
   (and (eq (substr str (+ pos 4) 1) "%")
     (setq hex (strcat hex (substr str (+ pos 5) 2)))
   )
   (setq txt (strcat (substr str 1 pos)
		(if (eq (strlen hex) 4)
		  (chr (- 50322 (hexdec hex)))
		  (chr (hexdec hex))
		)
      )
   )
   (if (eq (strlen hex) 4)
     (setq str (substr str (+ pos 7)))
     (setq str (substr str (+ pos 4)))
   )
   (if new
     (setq new (strcat new txt))
     (setq new txt)
   )
 )
 (if new
   (strcat new str)
   str
 )
)

 

 

Pour ouvrir un document .odt

(setq fil (getfiled "Veuillez sélectionner un fichier LibreOffice Writer" (getvar "dwgprefix") "odt" 16))

(setq oo-app (vlax-create-object "com.sun.star.ServiceManager"))
(setq oo-des (vlax-invoke oo-app 'createinstance "com.sun.star.frame.Desktop"))

(setq oo-doc (vlax-invoke-method oo-des 'loadComponentFromURL (decodeurl (strcat "file:///" (vl-string-translate "\\" "/" fil))) "_blank" 0 (vlax-make-safearray vlax-vbVariant '(0 . 0))))

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

J'ai continué mes recherches

 

Insérer un entête

(setq oo-sty (vlax-invoke (vlax-get oo-doc 'StyleFamilies) 'getByName "PageStyles"))
(setq oo-pge (vlax-invoke oo-sty 'getByName (vlax-get oo-obj 'PageStyleName)))
(vlax-put oo-pge 'HeaderIsOn :vlax-true)
(setq oo-txt (vlax-get oo-pge 'HeaderText))
(setq oo-cur (vlax-invoke oo-txt 'createTextCursor))
(vlax-put oo-cur 'paraAdjust 3)
(vlax-invoke oo-txt 'insertString oo-cur "Mon_Texte" :vlax-false)

 

Insérer un pied de page

(setq oo-sty (vlax-invoke (vlax-get oo-doc 'StyleFamilies) 'getByName "PageStyles"))
(setq oo-pge (vlax-invoke oo-sty 'getByName (vlax-get oo-obj 'PageStyleName)))
(vlax-put oo-pge 'FooterIsOn :vlax-true)
(setq oo-txt (vlax-get oo-pge 'FooterText))
(setq oo-cur (vlax-invoke oo-txt 'createTextCursor))
(vlax-put oo-cur 'paraAdjust 1)
(vlax-invoke oo-txt 'insertString oo-cur "Page 1/1" :vlax-false)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour Patrick et vraiment un grand merci pour ton aide sur ce post

je n'y serai pas arrivé pas sinon, j'ai vu le jour

 

je préconise l'utilisation de modèle writer avec extension ott car si l'utilisateur enregistre par mégarde le document odt

au lieu de faire enregistrer sous, le modèle est foutu

j'ai réajusté avec

 

(defun init-oo-writer-carrez (/ oo-des openPar)
(setq oo-app (vlax-create-object "com.sun.star.ServiceManager"))
(setq oo-des (vlax-invoke oo-app 'createinstance "com.sun.star.frame.Desktop"))
(setq oo-doc (vlax-invoke-method oo-des 'loadComponentFromURL (decodeurl (strcat "file:///" (vl-string-translate "\\" "/" "C:\\TMP\\modele.ott"))) "_blank" 0 (vlax-make-safearray vlax-vbVariant '(0 . 0))))
)

 

tout marche nickel

les deux commandes marchent très bien pour l'entête et le pied de page pour une ligne uniquement

mais quand on a différentes lignes à insérer, c'est vite le souk dans le fichier odt

 

Merci encore

on peut clôturer ce post

Thanks higher Patrick and see you soon

John

Posté(e)

Salut

 

les deux commandes marchent très bien pour l'entête et le pied de page pour une ligne uniquement

un exemple pour un entête sur deux lignes

Insérer un entête sur deux lignes
(setq oo-sty (vlax-invoke (vlax-get oo-doc 'StyleFamilies) 'getByName "PageStyles"))
(setq oo-pge (vlax-invoke oo-sty 'getByName (vlax-get oo-obj 'PageStyleName)))
(vlax-put oo-pge 'HeaderIsOn :vlax-true)
(vlax-put oo-pge 'HeaderBodyDistance 1000)
(vlax-put oo-pge 'HeaderHeight 2500)
(setq oo-txt (vlax-get oo-pge 'HeaderText))
(setq oo-cur (vlax-invoke oo-txt 'createTextCursor))
(vlax-put oo-cur 'paraAdjust 3)
(vlax-invoke oo-txt 'insertString oo-cur (strcat "Mon_Texte 1" (chr 10) "Mon_texte 2") :vlax-false)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité