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.
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 |