J’ai commencé à utiliser Open Office dès la version 1.
J’avais une version complète de Ms office, mais l’installer était tellement long - et à l’époque je changeais souvent de config – avec des codes à rallonge à entrer pour chaque module, que j’ai pris l’habitude d’utiliser oOo.
De là, la frustration lorsque l’on n’a pas Excel, et que l’on voit passer des outils en lisp pour utiliser Excel avec Autocad.
J’ai donc essayé de créer une bibliothèque équivalente à celles utilisant Excel pour oOo.
Ces premiers efforts datent de 2007, et depuis 2008, rien de nouveau n’a été fait.
J’espère relancer la machine en exhumant ce vieux sujet …
Le premier écueil rencontré, c’était d’ouvrir un document vierge oOo depuis Autocad.
Puis de paramétrer ce document.
Cela n’a pas été chose facile, malgré l’aide du site kalitech.
Ensuite j’ai eu besoin de piloter l’ouverture de fichiers xls, ods et csv existant depuis Autocad.
Les fichiers csv sont très utiles puisqu’on peut le générer directement avec un Write-line.
Il n’y a aujourd’hui que 4 routines :
acad2oOOsCalc Qui ouvre une feuille de calcul vierge OOo en utilisant l'API OOo pour VB
setOOoProp pour paramétrer les propriétés d'un objet de l'API OOo en VB
OpenCsvWithoOOsCalc Pour ouvrir une feuille de calcul au format csv spécifiée en utilisant l'API OOo pour VB
OpenSpreadSheetWithoOOsCalc Pour ouvrir une feuille de calcul spécifiée en utilisant l'API OOo pour VB / feuille
Prérequis:
Que PowerClic soit installé et fonctionnel, pour avoir accès aux fonctions « pw_ »
http://cadxp.com/index.php?/topic/15105-connexion-autocad-excel/page__st__20
http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;******************************************************************************
;§/openoffice/ Ouvrir une feuille de calcul vierge OOo en utilisant l'API OOo pour VB / none
;;site web de réference :
;;http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;
(defun acad2oOOsCalc ( / Oprop openPar)
;;;Set serviceManager = CreateObject("com.sun.star.serviceManager")
(setq serviceManager
(vlax-create-object "com.sun.star.serviceManager")
)
;;;Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
(setq Desktop (vlax-invoke-method
serviceManager
'createInstance
"com.sun.star.frame.Desktop"
)
)
;;;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 2)))
;;;'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure
;;; Set OpenPar(0) = setOOoProp("ReadOnly", True)
;(setq Oprop (setOOoProp "ReadOnly" :vlax-true))
(setq Oprop (setOOoProp "ReadOnly" :vlax-false))
(vlax-safearray-put-element openPar 0 Oprop)
;;; Set OpenPar(1) = setOOoProp("Password", "secret")
(setq Oprop (setOOoProp "Password" "secret"))
(vlax-safearray-put-element openPar 1 Oprop)
;;; Set OpenPar(2) = setOOoProp("Hidden", False)
(setq Oprop (setOOoProp "Hidden" :vlax-false))
(vlax-safearray-put-element openPar 2 Oprop)
;;;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, openPar)
(Setq DocumentoOOo
(vlax-invoke-method
Desktop 'loadComponentFromURL
"private:factory/scalc" "_blank"
0 openPar
)
)
)
;******************************************************************************
;§/openoffice/ Paramétrer les propriétés d'un objet de l'API OOo en VB / cName uValue
;; Certaines propriétés d'objet de l'API OOo sont du type structure.
;;Pour des raisons liées à l'implémentation du pont UNO-Automation
;;(cf http://api.openoffice.org/docs/DevelopersGuide/ProfUNO/ProfUNO.htm#1+4+4+5+3+Usage+of+Types),
;;on ne peut passer directement une structure VB en argument d'une fonction de l'API OOo. A partir de VB,
;;il faut donc utiliser une fonction particulière de l'API (Bridge_GetStruct)
;;pour accéder aux structures et pouvoir ensuite passer cette structure à la fonction OOo
(defun setOOoProp (cName uValue / oSM oPropertyValue)
;;;Function setOOoProp(cName, uValue) As Object
;;;
;;; Dim oPropertyValue As Object
;;; Dim oSM As Object
;;;
;;; Set oSM = CreateObject("com.sun.star.ServiceManager")
(setq oSM (vlax-create-object "com.sun.star.serviceManager"))
;;; Set oPropertyValue = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
(Setq oPropertyValue
(vlax-invoke-method
oSM
'Bridge_GetStruct
"com.sun.star.beans.PropertyValue"
)
)
;;; oPropertyValue.Name = cName
(vlax-put-property oPropertyValue 'Name cName)
;;; oPropertyValue.Value = uValue
(vlax-put-property oPropertyValue 'Value uValue)
;;;
;;; Set setOOoProp = oPropertyValue
;;;
;;;End Function
oPropertyValue
)
;******************************************************************************
;§/openoffice/ Ouvrir une feuille de calcul au format csv spécifiée en utilisant l'API OOo pour VB / feuille
;;site web de réference :
;;http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;
(defun OpenCsvWithoOOsCalc ( feuille / Oprop openPar)
(if (not feuille)
(setq feuille (getfiled "Feuille de calcul à charger : " (getvar "dwgprefix") "csv" 0) )
)
(setq feuille (strcat "file:///" (pw_slashit feuille )))
;;;Set serviceManager = CreateObject("com.sun.star.serviceManager")
(setq serviceManager
(vlax-create-object "com.sun.star.serviceManager")
)
;;Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
(setq Desktop (vlax-invoke-method
serviceManager
'createInstance
"com.sun.star.frame.Desktop"
)
)
;;;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 2)))
;;;'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure
;;; Set OpenPar(0) = setOOoProp("ReadOnly", True)
;;; ;(setq Oprop (setOOoProp "ReadOnly" :vlax-true))
(setq Oprop (setOOoProp "ReadOnly" :vlax-false))
(vlax-safearray-put-element openPar 0 Oprop)
;;;;;; Set OpenPar(2) = setOOoProp("Hidden", False)
(setq Oprop (setOOoProp "Hidden" :vlax-false))
(vlax-safearray-put-element openPar 1 Oprop)
;;; - * - *
;; attention, ce qui suit est primordial pour ouvrir du csv avec openoffice:
;;;Dim oPropertyValue(0) As New com.sun.star.beans.PropertyValue
;;;oPropertyValue(0).Name = "FilterOptions"
;;;oPropertyValue(0).Value = "44"
;;;
;;;oDoc = starDeskTop.loadComponentFromURL( oUrl, "_blank", 0, oPropertyValue )
(setq Oprop (setOOoProp "FilterOptions" "44"));_ 44 pour , car (ascii ",") = 44
;;; (setq Oprop (setOOoProp "FilterOptions" "59"));_59 pour ;
(vlax-safearray-put-element openPar 2 Oprop)
;;; ;;;mFileProperties(0).Name = "FilterName"
;;; ;;;mFileProperties(0).Value = "scalc: Text - txt - csv (StarCalc)"
;;; (setq Oprop (setOOoProp "FilterName" "scalc: Text - txt - csv (StarCalc)"))
;;; (vlax-safearray-put-element openPar 3 Oprop)
;;;
;;;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, openPar)
(Setq DocumentoOOo
(vlax-invoke-method
Desktop 'loadComponentFromURL
feuille "_blank"
0 openPar
)
)
)
;******************************************************************************
;§/openoffice/ Ouvrir une feuille de calcul spécifiée en utilisant l'API OOo pour VB / feuille
;;site web de réference :
;;http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;
(defun OpenSpreadSheetWithoOOsCalc ( feuille / Oprop openPar)
(if (not feuille)
(setq feuille (getfiled "Feuille de calcul à charger : " (getvar "dwgprefix") "ods;xls" 0) )
)
(setq feuille (strcat "file:///" (pw_slashit feuille )))
;;;Set serviceManager = CreateObject("com.sun.star.serviceManager")
(setq serviceManager
(vlax-create-object "com.sun.star.serviceManager")
)
;;Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
(setq Desktop (vlax-invoke-method
serviceManager
'createInstance
"com.sun.star.frame.Desktop"
)
)
;;;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 1)))
;;;'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure
;;; Set OpenPar(0) = setOOoProp("ReadOnly", True)
;;; ;(setq Oprop (setOOoProp "ReadOnly" :vlax-true))
(setq Oprop (setOOoProp "ReadOnly" :vlax-false))
(vlax-safearray-put-element openPar 0 Oprop)
;;;;;; Set OpenPar(1) = setOOoProp("Password", "secret")
;;; (setq Oprop (setOOoProp "Password" "secret"))
;;; (vlax-safearray-put-element openPar 1 Oprop)
;;;;;; Set OpenPar(2) = setOOoProp("Hidden", False)
(setq Oprop (setOOoProp "Hidden" :vlax-false))
(vlax-safearray-put-element openPar 1 Oprop)
;;;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, openPar)
(Setq DocumentoOOo
(vlax-invoke-method
Desktop 'loadComponentFromURL
feuille "_blank"
0 openPar
)
)
)