Trabajando con documentos

From Apache OpenOffice Wiki
Jump to: navigation, search


Editing.png Esta página está en estado borrador.

En donde veremos como manipular documentos de OpenOffice.org, crearlos y guardarlos. El trabajo común a la mayoría de los documentos.


Creando nuevos documentos

Como ya dijimos, el método que nos permite crear nuevos documentos se llama loadComponentFromURL y es un método del servicio “com.sun.star.frame.XComponentLoader”, veamos primero los ejemplos y después las explicaciones.


 Option Explicit
 
 Sub CreandoNuevosDocumentos1()
 Dim sRuta As String
 Dim mArg()
 Dim oNuevoDocumento As Object
 
     sRuta = "private:factory/scalc"
     oNuevoDocumento = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
 End Sub


¿Ya la probaste?, muy fácil ¿no?, creamos una nueva hoja de calculo, y si, lo deduces bien, solo hay que hacer unos pequeños cambios para crear un documento de texto.


 Sub CreandoNuevosDocumentos2()
 Dim sRuta As String
 Dim mArg()
 Dim oNuevoDocumento As Object
 
     sRuta = "private:factory/swriter"
     oNuevoDocumento = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
 End Sub


Y los demás tipos de documentos.


 Sub CreandoNuevosDocumentos3()
 Dim sRuta As String
 Dim mArg()
 Dim oNuevoDocumento As Object
 
     sRuta = "private:factory/simpress"
     oNuevoDocumento = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
     sRuta = "private:factory/sdraw"
     oNuevoDocumento = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
     sRuta = "private:factory/smath"
     oNuevoDocumento = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
 End Sub


¿Y una base de datos?, probemos.


 Sub CreandoNuevosDocumentos4()
 Dim sRuta As String
 Dim mArg()
 Dim oNuevoDocumento As Object
 
     sRuta = "private:factory/sbase"
     oNuevoDocumento = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
 End Sub


ES StarBasic TrabajandoConOOo.08.png


Nos da un error ¿verdad?


No esta soportado. Para saber por que nos da un error, intenta abrir una base de datos nueva, observa como primero, si queremos trabajar con ella, el asistente nos “obliga” primero a guardarla con un nombre y después ya podemos manipularla, esto, solo pasa con las bases de datos, de los demás documentos podemos crear tantos nuevos documentos como queramos sin tener que guardar nada, entonces ¿como creamos una nueva base de datos?, la respuesta es sencilla, del mismo modo que lo hacemos desde la interfaz de usuario, es decir, tenemos que guardar primero la base de datos.


 Option Explicit
 
 Sub CreandoBaseDeDatos1()
 Dim oBDServicio As Object
 Dim oBDNueva As Object
 Dim sRuta As String
 Dim mArg()
 
     'Ruta y nombre donde quedara guardada la base de datos
     sRuta = "/home/mau/Mi_Base_Datos.odb"
     'Creamos el servicio que nos permite manipular bases de datos
     oBDServicio = createUnoService( "com.sun.star.sdb.DatabaseContext" )
     'Creamos una nueva instancia de una base de datos
     oBDNueva = oBDServicio.createInstance()
     'Establecemos el tipo de base
     oBDNueva.URL = "sdbc:embedded:hsqldb"
     'Y la guardamos
     oBDNueva.DatabaseDocument.storeAsURL( sRuta, mArg() )
 
 End Sub


Toma en cuenta dos cosas muy importantes en la macro anterior, el nombre que uses, si ya existe, simplemente lo reemplazara, no te preguntara nada, así que ten cuidado de no usar una ruta o nombre de una base importante que tengas y segundo, la base de datos así creada, no quedara “registrada” en OpenOffice.org, con lo que no tendrás acceso desde otros programas de la aplicación, más adelante veremos como registrar una base de datos por código.


Rutas de archivos y directorios

OpenOffice.org, al ser multiplataforma, hace uso de las rutas de archivos y directorios, en el formato URL, por ejemplo.


file:///home/usuario/datos/miarchivo.ods

file:///d:/datos/miarchivo.ods


Toma en cuenta que este formato hace uso de los caracteres 0-9, a-z y A-Z, y cualquier otro carácter será convertido y mostrado con su respectivo código, por ejemplo, los espacios los reemplazara con %20. Siempre que le pases una ruta de archivo a cualquier servicio de OpenOffice.org, procura, casi como una regla, pasarle la ruta en formato Url, para ello, OOo Basic cuenta con dos funciones muy útiles que hacen el trabajo ConvertToUrl y ConvertFromUrl, veamos como se usan.


 Sub RutasDeArchivos1()
 Dim sRuta As String
 
     'Establecemos una ruta
     sRuta = "/home/mau/Mi archivo de Calc.ods"
     'Y la mostramos
     MsgBox sRuta
 
     'La convertimos al formato URL
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     'Y vemos el resultado
     MsgBox sRuta
 
     'Regresamos al formato local
     sRuta = ConvertFromUrl( sRuta )
     'Y comprobamos que es correcto
     MsgBox sRuta
 
 End Sub


Abre varios documentos existentes y ejecuta la siguiente macro desde cada uno:


 Sub DocumentoActivoMostrarDatos()
 Dim sRutaURL As String
 Dim sRutaCompleta As String
 Dim sRuta As String
 Dim sNombre As String
 
     GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
     'Referencia al documento activo
     sRutaURL = ThisComponent.getURL()
     'Convertimos la ruta URL en formato local
     sRutaCompleta = ConvertFromUrl( sRutaURL )
     'Obtenemos solo el nombre del archivo
     sNombre = FileNameOutOfPath( sRutaURL )
     'Obtenemos el directorio donde esta el archivo
     sRuta = DirectoryNameoutofPath(sRutaCompleta, GetPathSeparator())
     'Mostramos los resultados
     MsgBox sRutaCompleta & Chr(13) & Chr(13) & sNombre & Chr(13) & Chr(13) & sRuta
 
 End Sub


El objeto ThisComponent, es una palabra clave especial que designa al documento desde el cual llamamos a nuestra macro, es buena practica de programación, comprobar siempre a que tipo de documento esta apuntando ThisComponent, no es lo mismo si ejecutas una macro desde la interfaz del usuario, a que lo hagas desde el IDE, y aun desde el IDE, dependerá si haces referencia a el desde un archivo cualquiera o desde el archivo especial Mis Macros, así que siempre verifica que el objeto apuntado con ThisComponent, sea el que esperas. Observa que hacemos uso de algunas funciones incorporadas de OpenOffice.org, estas son: FileNameOutOfPath, que te devuelve de la ruta pasada solo el nombre del archivo y DirectoryNameoutofPath, que te regresa solo el directorio de la ruta del archivo pasada. Estas y otras útiles funciones se encuentran dentro de la biblioteca Tools de OpenOffice.org que cargamos en la primer línea de nuestra macro de ejemplo.


En nuestro siguiente tema, veremos la importancia de usar las rutas de archivos y directorios en formato Url y recuerda que en S.O. Linux, se tiene en cuenta la diferencia entre mayúsculas y minúsculas.


Abriendo, guardando y cerrando documentos

Abrir archivos existentes es sumamente sencillo, usamos el mismo método usado para crear nuevos documentos, pero en el parámetro ruta, le especificamos la ubicación del archivo a abrir de la siguiente manera.


 Sub AbriendoDocumentos1()
 Dim sRuta As String
 Dim mArg()
 Dim oDocumento As Object
 
     'Reemplaza esta ruta por la ruta de tú archivo
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     oDocumento = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mArg() )
 
 End Sub


Si tu archivo existe, el código anterior lo abrirá, “siempre” utiliza ConvertToUrl cuando uses rutas de archivos o directorios en funciones de OpenOffice.org que las requieran


Si abres una plantilla, esta se comportara de forma normal, es decir, te abrirá una copia de dicha plantilla.


     sRuta = ConvertToUrl( "/home/mau/Mi Plantilla.ots" )
     oDocumento = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mArg() )


Pero también podrías querer abrir la plantilla para editarla, en este caso, le indicamos en las opciones de apertura esto, observa como se declara la variable mOpciones.


 Sub AbriendoDocumentos3()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "AsTemplate"
     mOpciones(0).Value = False
 
     sRuta = ConvertToUrl( "/home/mau/miPlantilla.ots" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


La estructura "com.sun.star.beans.PropertyValue" esta conformada por un par de valores, un nombre y un valor y es muy frecuentemente usada cuando se programa en OOo Basic, observa como la matriz de la variable mOpciones la hemos inicializado en 0, es decir, solo contendrá un par de valores, pero muy bien puede tener más opciones como veremos más adelante. En la macro anterior le estamos indicando la propiedad AsTemplate (que seria algo así como Es Plantilla), si el valor es falso (False), le estamos indicando que queremos abrir la plantilla para editarla, en caso contrario (True) abrirá una copia de la plantilla. Lo interesante de esta propiedad es que perfectamente la puedes aplicar a archivos existentes, es decir, archivos que “no” necesariamente sean plantillas, con esta propiedad podemos forzarlos a comportarse como plantillas, por ejemplo, prueba el siguiente código con algún archivo existente que no sea plantilla.


 Sub AbriendoDocumentos4()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "AsTemplate"
     mOpciones(0).Value = True
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Writer.odt" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Observa como el archivo es un documento de texto normal (ODT), pero con la propiedad AsTemplate, forzamos su apertura como una plantilla. Otras propiedades interesantes son ReadOnly (Solo Lectura) para abrir un archivo como solo lectura y Password (Contraseña) para abrir archivos con contraseña.


 Sub AbriendoDocumentos5()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "ReadOnly"
     mOpciones(0).Value = True
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Writer.odt" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub
 
 Sub AbriendoDocumentos6()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     'La contraseña más segura
     mOpciones(0).Name = "Password"
     mOpciones(0).Value = "letmein"
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Draw.odg" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Por supuesto puedes combinar cualquier cantidad de opciones siempre y cuando no entren en conflicto.


 Sub AbriendoDocumentos7()
 Dim sRuta As String
 Dim mOpciones(1) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "ReadOnly"
     mOpciones(0).Value = True
     mOpciones(1).Name = "Password"
     mOpciones(1).Value = "abrete"
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Draw.odg" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Prueba a poner la contraseña incorrecta y observa el mensaje, por supuesto, podemos solicitarle al usuario la contraseña y no esta demás verificar que el archivo exista.


 Sub AbriendoDocumentos8()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 Dim sContra As String
 
     sContra = Trim( InputBox( "Introduce la contraseña de apertura" ) )
     mOpciones(0).Name = "Password"
     mOpciones(0).Value = sContra
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Draw.odg" )
 
         'Verificamos que exista el archivo
     If Len(Dir(sRuta)) > 0 Then
         oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
     Else
         MsgBox "El archivo no existe"
     End If
 
 End Sub


Mientras un formato de archivo sea soportado por OpenOffice.org, lo podrás abrir con el método loadComponentFromURL, en el siguiente ejemplo, abrimos un archivo tipo Doc, un Html y un Xls.


 Sub AbriendoDocumentos9()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = ConvertToUrl( "/home/mau/Campamentos.doc" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     sRuta = ConvertToUrl( "/home/mau/Renacimiento.htm" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     sRuta = ConvertToUrl( "/home/mau/datos.xls" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Cuando abres un archivo por código y este contiene macros, tu puedes establecer si se abre con las macros activadas, de forma predeterminada lo abre con las macros desactivadas, así que solo nos resta saber como abrirlo con las macros activadas.


 Sub AbriendoDocumentos10()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "MacroExecutionMode"
     mOpciones(0).Value = 4
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Otra opción interesante, es la que nos permite abrir una presentación e iniciarla inmediatamente.


 Sub AbriendoDocumentos11()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "StartPresentation"
     mOpciones(0).Value = True
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Impress.odp" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Puedes abrir un archivo como vista previa, útil para evitar que el usuario haga cambios en el, en este estado, los cambios que intente hacer el usuario no se guardaran.


 Sub AbriendoDocumentos12()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     mOpciones(0).Name = "Preview"
     mOpciones(0).Value = True
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Writer.odt" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
 End Sub


Por supuesto, la idea general de abrir un archivo es para obtener datos de el o para manipularlo, ya sea un documento nuevo o uno existente, veamos como guardar los cambios realizados y cerrar el archivo.


 Sub AbriendoGuardandoDocumentos1()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     'AQUI va todo el código que quieras para manipular el archivo
 
     MsgBox "Archivo abierto y modificado correctamente, presione Aceptar para guardar y cerrar"
 
     'Guardamos los cambios
     oDoc.store()
     'Cerramos el archivo
     oDoc.close(True)
 
 End Sub


El código anterior funcionara con un archivo existente, pero con uno nuevo no, te dará un error, por supuesto no me creas, compruébalo. Los documentos tienen una propiedad (hasLocation) que nos informan si un documento ya esta guardado o no.


 Sub AbriendoGuardandoDocumentos2()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = "private:factory/scalc"
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     'Nos indica si el archivo esta guardado físicamente
     MsgBox oDoc.hasLocation()
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     MsgBox oDoc.hasLocation()
 
 End Sub


El primer mensaje debe mostrarte Falso (False) porque es un documento nuevo y el segundo Verdadero (True) por ser un archivo abierto del disco.


También tenemos una propiedad que nos ayuda a saber si un documento ha sido modificado o no, ejecuta la siguiente macro, llamándola desde diferentes documentos, unos ábrelos y modifícalos antes de ejecutarla, otros, solo ábrelos y ejecútala para que notes la diferencia.


 Sub EstaModificado()
 
     MsgBox ThisComponent.isModified()
 
 End Sub


Y otra más que nos informa si el documento es de solo lectura.


 Sub AbriendoGuardandoDocumentos3()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = "private:factory/scalc"
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     MsgBox oDoc.isReadOnly()
 
     mOpciones(0).Name = "ReadOnly"
     mOpciones(0).Value = True
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     MsgBox oDoc.isReadOnly()
 
 End Sub


Ya te imaginaras que útil es saber, antes de guardar un archivo, si este es de solo lectura, si ha sido modificado o si ya ha sido guardado, antes de ver trabajando juntas todas estas propiedades, veamos como guardar un archivo nuevo con el método storeAsUrl.


 Sub AbriendoGuardandoDocumentos4()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = "private:factory/scalc"
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     'Establecemos la ruta y nombre donde se guardara el archivo
     sRuta = ConvertToUrl( "/home/mau/Archivo de Calc.ods" )
     'Guardamos el archivo
     oDoc.storeAsURL( sRuta, mOpciones() )
 
 End Sub


Observa como requiere dos parámetros, la ruta del archivo y una matriz de propiedades, algunas de las cuales veremos a continuación. Toma nota de que si el archivo ya existe lo reemplazara sin avisarte por lo que es buena practica de programación verificar esto.


 Sub AbriendoGuardandoDocumentos5()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = "private:factory/scalc"
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     sRuta = ConvertToUrl( "/home/mau/Archivo de Calc.ods" )
     If Len( Dir( sRuta )) = 0 Then
         'Guardamos el archivo
         oDoc.storeAsURL( sRuta, mOpciones() )
     Else
         MsgBox "El archivo ya existe, no se ha guardado el nuevo archivo"
     End If
 
 End Sub


Te queda de tarea implementar la pregunta al usuario para reemplazar o no el archivo. Veamos algunas propiedades interesantes para guardar archivos, por ejemplo, guardar con contraseña.


 Sub AbriendoGuardandoDocumentos6()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = "private:factory/scalc"
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     'Como vez no tengo mucha imaginación
     mOpciones(0).Name = "Password"
     mOpciones(0).Value = "abrete"
     sRuta = ConvertToUrl( "/home/mau/Archivo de Calc.ods" )
     oDoc.storeAsURL( sRuta, mOpciones() )
 
 End Sub


Como sabes, OpenOffice.org, soporta la importación/exportación de múltiples formatos de archivos, veamos como guardar, por ejemplo, en formato DOC.


 Sub AbriendoGuardandoDocumentos7()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = "private:factory/swriter"
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     'Establecemos el filtro a documentos tipo DOC
     mOpciones(0).Name = "FilterName"
     mOpciones(0).Value = "MS Word 97"
     sRuta = ConvertToUrl( "/home/mau/Archivo de Word.doc" )
     oDoc.storeAsURL( sRuta, mOpciones() )
 
 End Sub


El método storeAsURL también lo puedes usar para abrir un archivo existente y guardarlo con otro nombre.


 Sub AbriendoGuardandoDocumentos8()
 Dim sRuta As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 Dim oDoc As Object
 
     sRuta = ConvertToUrl( "/home/mau/Mi archivo de Calc.ods" )
     oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
 
     sRuta = ConvertToUrl( "/home/mau/Nuevo archivo Calc.ods" )
     oDoc.storeAsURL( sRuta, mOpciones() )
 
 End Sub


Para terminar esta capitulo, vamos a hacer un poco más interactivo la apertura y guardado de archivos, permitamos que el usuario escoja la ruta y el archivo desde un cuadro de dialogo, para ello, usaremos el servicio com.sun.star.ui.dialogs.FilePicker, que nos permite hacer esto, veamos como.


 Sub AbrirArchivo1()
 Dim oDlgAbrirArchivo as Object
 Dim mArchivo() As String
 Dim mOpciones()
 Dim sRuta As String
 Dim oDoc As Object
 
     'Creamos el servicio necesario
     oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
     'Establecemos el titulo del cuadro de dialogo
     oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
     'Con el método .Execute() mostramos el cuadro de dialogo
     'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
     'Si presiona Cancelar devuelve 0
     If oDlgAbrirArchivo.Execute() Then
         'De forma predeterminada, solo se puede seleccionar un archivo
         'pero devuelve una matriz de todos modos con la ruta completa
         'del archivo en formato URL
         mArchivo() = oDlgAbrirArchivo.getFiles()
         'El primer elemento de la matriz es el archivo seleccionado
         sRuta = mArchivo(0)
         'Y lo abrimos
         oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
     Else
         'Si el usuario presiona Cancelar
         MsgBox "Proceso cancelado"
     End If
 
 End Sub


Si quieres abrir más de un archivo a la vez, usa.


 Sub AbrirArchivo2()
 Dim oDlgAbrirArchivo as Object
 Dim mArchivos() As String
 Dim mOpciones()
 Dim co1 As Integer
 
     oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
     oDlgAbrirArchivo.setTitle("Selecciona los archivos a abrir")
     'Establecemos que se puedan seleccionar mas de un archivo
     oDlgAbrirArchivo.setMultiSelectionMode(True)
 
     If oDlgAbrirArchivo.Execute() Then
         mArchivos() = oDlgAbrirArchivo.getSelectedFiles()
         'Mostramos los archivos seleccionados
         For co1 = LBound( mArchivos() ) To UBound( mArchivos() )
             MsgBox ConvertFromUrl( mArchivos(co1) )
         Next
             'Te queda de tarea abrir todos los archivos
             'oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
     Else
         MsgBox "Proceso cancelado"
     End If
 
 End Sub


Ahora, mostramos el cuadro de dialogo Guardar Como, para permitir al usuario seleccionar carpeta y nombre de archivo donde guardar su archivo.


 Sub GuardarArchivo1()
 Dim oDlgGuardarArchivo as Object
 Dim mDlgOpciones()
 Dim mArchivo() As String
 Dim mOpciones()
 
     'Usamos el mismo servicio para abrir archivos, pues es el mismo cuadro de dialogo
     oDlgGuardarArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
     'Establecemos que nos muestre el cuadro de dialogo Guardar Como con las
     'casillas de verificación Autoextension y guardar con contraseña
     'com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION_PASSWORD = 2
     mDlgOpciones() = Array(2)
     With oDlgGuardarArchivo
         'Iniciamos el cuadro de dialogo con las opciones seleccionadas
         .Initialize ( mDlgOpciones() )
         'Agregamos filtros de archivos
         .AppendFilter( "All files (*.*)", "*.*" )
         .AppendFilter( "Documento de Texto ODF (.odt)", "*.odt" )
         .AppendFilter( "Hoja de calculo ODF (.ods)", "*.ods" )
     End With
 
     'Lo mostramos
     If oDlgGuardarArchivo.Execute() Then
         mArchivo() = oDlgGuardarArchivo.getFiles()
         'Solo te muestro la ruta y nombre de archivo seleccionado
         'Solo te resta guardar el archivo
         MsgBox ConvertFromUrl( mArchivo(0) )
     Else
         MsgBox "Proceso cancelado"
     End If
 
 End Sub


Los cuadros de diálogo que veas, estarán en función de la opción del menú Herramientas > Opciones... > General > Abre/Guarda diálogos, casilla de verificación Usa los diálogos OpenOffice.org.


Exportando a PDF

Exportar a PDF desde OpenOffice.org es muy sencillo, lo es también con OOo Basic, prueba la siguiente macro desde diferentes documentos, por ahora, asegúrate de que los archivos ya estén guardados antes de exportar, te queda de tarea intentar adaptarla para archivos nuevos.


 Sub ExportarPDF()
 Dim oDoc As Object
 Dim sTipoDoc As String
 Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
 dim sRuta As string
 
     BasicLibraries.LoadLibrary( "Tools" )
     'Referencia al documento desde donde se llama la macro
     oDoc = ThisComponent
 
     'Obtenemos el tipo de documento, esta función ya la usamos
     sTipoDoc = TipoDocumento( oDoc )
 
     'Solo se pueden exportar (por ahora)
     Select Case sTipoDoc
         'los siguiente documentos
         Case "Calc", "Writer", "Draw", "Impress", "Math"
             'Establecemos el tipo de filtro
             mOpciones(0).Name = "FilterName"
             'Construimos el filtro correcto PDF para cada aplicacion
             mOpciones(0).Value = LCase(sTipoDoc) & "_pdf_Export"
 
             'Construimos la ruta correcta, usamos el mismo directorio
             'y nombre del archivo, solo agregamos la extensión PDF
             sRuta = GetFileNameWithoutExtension( oDoc.getUrl ) & ".pdf"
 
             'Guardamos el archivo
             oDoc.storeToURL( sRuta, mOpciones() )
         Case Else
             MsgBox "Aplicación no soportada"
     End Select
 
 End Sub


La función GetFileNameWithoutExtension viene integrada en las macros de OpenOffice.org, de la ruta pasada, te devuelve toda la ruta pero sin la extensión del archivo, observa como solo le agregamos la extensión PDF, también observa que esta vez “no” hemos usado storeAsUrl, sino storeToUrl para exportar el archivo.


Te habrás dado cuenta de que las variantes pueden ser inmensas, pero creo que tenemos los elementos para empezar a automatizar nuestras tareas diarias, en los siguientes capítulos, ahondaremos en las características especificas de cada tipo de documento.


Tareas comunes en documentos

Veamos algunas tareas comunes a la mayoría de los documentos de OOo, por ejemplo, para saber el titulo del documento activo, usamos.


 Sub ControlarAplicacion1()
 Dim oDoc As Object
 Dim oControlador As Object
 
     'El documento desde donde se llama esta macro
     oDoc = ThisComponent
     'El controlador del documento actual
     oControlador = oDoc.getCurrentController
     'El titulo
     MsgBox oControlador.getTitle
 
 End Sub


Para activar el documento que quieras, se usa el método setFocus de la siguiente manera, en donde activamos durante un segundo y medio cada documento de OOo abierto.


 Sub ControlarAplicacion2()
 Dim oDocumentos As Object
 Dim oDocumento As Object
 Dim oVentana As Object
 Dim oEnumeraDocumentos As Object
 
     'Accedemos a todos los documentos actualmente abiertos
     oDocumentos = StarDesktop.getComponents()
     'Enumeramos cada uno
     oEnumeraDocumentos = oDocumentos.createEnumeration()
     'hasMoreElements devuelve verdadero (True) mientras haya elementos
     Do While oEnumeraDocumentos.hasMoreElements()
         'Nos desplazamos al siguiente elemento y lo asignamos
         oDocumento = oEnumeraDocumentos.nextElement()
         'Obtenemos acceso a la ventana
         oVentana = oDocumento.getCurrentController.getFrame.getComponentWindow()
         'Le enviamos el foco para activarla
         oVentana.setFocus()
         'Esperamos 1.5 segundos para pasar al siguiente documento
         Wait 1500
     Loop
 
 End Sub


Una posibilidad interesante, es la de controlar la barra de estado de las aplicaciones, muy útil para mostrar mensajes al usuario o mostrar una barra de progreso, como en el siguiente ejemplo.


 Sub ControlarAplicacion3()
 Dim oBarraEstado As Object
 Dim co1 As Integer
 
     'Referencia a la barra de estado del documento activo
     oBarraEstado = ThisComponent.getCurrentController.StatusIndicator
     'Establecemos el texto inicial y el limite de la barra de progreso
     oBarraEstado.start( "Contando ", 10 )
     For co1 = 1 To 10
         'Establecemos el valor de la barra de progreso
         oBarraEstado.setValue( co1 )
         'Esperamos un segundo
         Wait 1000
     Next
     'Es importante finalizar la barra de estado para devolverle el control a la aplicación
     oBarraEstado.end()
 
 End Sub


La macro anterior, funcionará en todas las aplicaciones, excepto en Base, por lo que tienes que validar en su caso si es necesario, también puedes cambiar el texto durante el progreso para dar más información al usuario, como en.


 Sub ControlarAplicacion4()
 Dim oBarraEstado As Object
 Dim co1 As Integer
 
     'Referencia a la barra de estado del documento activo
     oBarraEstado = ThisComponent.getCurrentController.StatusIndicator
     'Establecemos el texto inicial y el limite de la barra de progreso
     oBarraEstado.start( "Procesando Líneas ", 10 )
     For co1 = 1 To 10
         'Establecemos el valor de la barra de progreso
         oBarraEstado.setValue( co1 )
         'Y el texto
         oBarraEstado.setText( "Procesando la línea: " & co1 )
         'Esperamos un segundo
         Wait 1000
     Next
     'Es importante finalizar la barra de estado para devolverle el control a la aplicación
     oBarraEstado.end()
 
 End Sub


Cuando hagas uso de la barra de estado para mostrar el progreso de una tarea, es recomendable hacerlo en ciclos determinados, para saber siempre donde terminará, esto te permite mostrar una avance “real” de tu proceso.


Otra opción es cambiar el zoom de la vista del documento.


 Sub ControlarAplicacion5()
 Dim oDoc As Object
 Dim oDH As Object
 dim mOpc(0) As New com.sun.star.beans.PropertyValue
 
     'Acceso al marco del documento
     oDoc = ThisComponent.CurrentController.Frame
     'El despachador de instrucciones a nivel usuario
     oDH = createUnoService("com.sun.star.frame.DispatchHelper")
 
     'El método que deseamos ejecutar
     mOpc(0).Name = "ZoomSlider.CurrentZoom"
     'El valor deseado, en este caso 150%
     mOpc(0).Value = 150
     'Ejecutamos la orden
     oDH.executeDispatch(oDoc, ".uno:ZoomSlider", "", 0, mOpc() )
 
 End Sub


La opción anterior, solo funcionará en las aplicaciones que soporten zoom; Writer, Calc, Impress y Draw, Base y Math no lo implementan, pero no te dará ningún error si llamas a la macro desde estas aplicaciones, simplemente ignorará la instrucción.



ES.Plantillas.Logo foro es.png
Si tienes dudas acerca de lo aquí explicado, tienes algún problema con AOO,
o quieres ampliar la información, no dudes en dirigirte al

Foro Oficial en español de Apache OpenOffice para Macros y API UNO

Personal tools