Trabajando con documentos
En donde veremos como manipular documentos de OpenOffice.org, crearlos y guardarlos. El trabajo común a la mayoría de los documentos.
Contents
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
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.
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 |