Documentos de Académico
Documentos de Profesional
Documentos de Cultura
A
OpenOffice.org Basic
por
Noelson Alves Duarte
Versión 1
Índice
1 Macros OpenOffice.org Basic...........................................................................................................5
1.1 Introducción...............................................................................................................................5
1.2 Creando la Primera Macro.........................................................................................................5
1.3 Ejecutando la Primera Macro.....................................................................................................7
1.4 Compartiendo una Macro..........................................................................................................9
2Diálogos Personalizados...................................................................................................................11
2.1 Introducción.............................................................................................................................11
2.2 Creando un Cuadro de Diálogo ...............................................................................................11
2.3 Manejando Eventos del Cuadro de Diálogo............................................................................14
3 Pilotos Automáticos.........................................................................................................................17
3.1 Introducción.............................................................................................................................17
3.2 Creando un Piloto Automático................................................................................................17
3.3 Manipulando Eventos del Piloto Automático..........................................................................19
4 Introducción al API de OpenOffice.org...........................................................................................21
4.1 Introducción.............................................................................................................................21
4.2 Creando un nuevo documento.................................................................................................23
5 Trabajando con Documentos...........................................................................................................25
5.1 Cargando Documentos.............................................................................................................25
5.2 Guardando Documentos...........................................................................................................27
5.3 Imprimiendo Documentos.......................................................................................................28
5.4 Cerrando Documentos.............................................................................................................30
5.5 Identificando los Documentos Abiertos...................................................................................31
6 Documentos de Writer.....................................................................................................................33
6.1 Introducción.............................................................................................................................33
6.2 Editando texto..........................................................................................................................33
6.3 Moviéndose por el texto..........................................................................................................34
6.4 Formateando texto...................................................................................................................38
6.5 Formateando con estilo ...........................................................................................................40
6.6 Obteniendo el objeto seleccionado..........................................................................................44
6.7 Localizando objetos.................................................................................................................46
6.8 Búsqueda y Reemplazo............................................................................................................47
6.9 Insertando objetos....................................................................................................................49
6.10 Tablas.....................................................................................................................................50
7 Documentos de Calc........................................................................................................................57
7.1 Introducción.............................................................................................................................57
7.2 Hojas de cálculo.......................................................................................................................57
7.3 Editando...................................................................................................................................59
7.4 Navegando por las Celdas........................................................................................................61
7.5 Obteniendo objetos seleccionados...........................................................................................63
7.6 Formateando............................................................................................................................64
7.7 Búsqueda y Reemplazo............................................................................................................70
7.8 Ordenando................................................................................................................................71
7.9 Filtrando dados........................................................................................................................73
7.10 Insertando Subtotales.............................................................................................................74
7.11 Gráficos..................................................................................................................................76
8 Más información..............................................................................................................................81
8.1 En la red...................................................................................................................................81
8.2 Con el autor..............................................................................................................................82
9 Créditos, Agradecimientos, Licencia...............................................................................................83
9.1 Créditos....................................................................................................................................83
9.2 Agradecimientos ....................................................................................................................83
9.3 Licencia....................................................................................................................................83
Presentación
Este documento es el resultado de mi esfuerzo por aprender OpenOffice.org Basic.
Está enfocado, principalmente, en las extensiones del lenguaje Basic para OpenOffice.org, es de-
cir, en la API de OpenOffice.org. Siendo así, no se abordan las características básicas del len-
guaje de programación Basic.
Si usted ha programado anteriormente o conoce alguno de los “sabores” Basic y desea escribir
macros para OpenOffice.org éste es un buen punto de partida. Si no, le recomiendo buscar algún
curso en la red y familiarizarse con el lenguaje Basic antes de aventurarse en OOo Basic. Es muy
importante dominar los fundamentos de un lenguaje de programación.
Todos los ejemplos del código fuente se comprobaron con OpenOffice.org, versión 1.0.1, excep-
to los pequeños bloques de código fuera de las subrutinas.1
Para utilizar adecuadamente este texto, OpenOffice.org debe estar instalado en su ordenador.
Tras el Capítulo 3, recomiendo que usted instale, también, el Manual de Referencia de la API de
OpenOffice.org (consulte el capítulo 8. Más Informaciones). El Manual de Referencia se actua-
liza periódicamente y su versión actualizada está disponible también para consultas “on-line”.
Espero disponer de tiempo para continuar aprendiendo y adquiriendo informaciones útiles para
los programadores que, como yo mismo, no dominan la lengua inglesa. Por lo tanto, periódica-
mente, busque nuevas versiones de este documento.
Como resultado de un proceso de aprendizaje, esta Introducción..., seguramente, contiene
algunos errores e inconsistencias; espero contar con su ayuda para corregirlos.
20 de junio de 2003
El Autor
1 N. del T.: Esta traducción española ha sido adaptada a la versión 1.1, por cuyo motivo las capturas de pantalla y al-
gunos menús, pueden diferir de los que se mostraban en la obra original, elaborada a partir de la versión 1.0.1.
Además, la inclusión en la más reciente versión de OpenOffice.org de una potente grabadora de macros (no tratada
en esta Introducción), abre perspectivas insospechadas para los usuarios, al permitirles crear sus macros sin
necesidad de ser expertos programadores.
1.1 Introducción
Una macro es un programa escrito en lenguaje OpenOffice.org Basic con el objetivo de auto-
matizar tareas de OpenOffice.org
El lenguaje OpenOffice.org Basic mantiene las principales características de las versiones ac-
tuales de BASIC en lo referente a sintaxis, tipos de datos, operadores, comandos, funciones
internas y organización general del programa. Además, OpenOffice.org Basic permite el ac-
ceso a una gran cantidad de objetos, con sus métodos y propiedades, específicos de
OpenOffice.
OpenOffice.org posee un IDE (Integrated Development Environment – Entorno de Desarrollo
Integrado) completo, que incluye: edición de código fuente, verificación de errores, creación
de cuadros de diálogo y administración de librerías.
c) Sustituya el nombre erróneo de la variable oCurso por el correcto oCursor. Cierre el IDE
Basic.
Guarde el documento Primera_Macro.sxw.
En el próximo paso, veremos como hacer disponible una macro para todos los documentos de
OpenOffice.org.
Tras esta operación la biblioteca se habrá añadido al recipiente soffice. Normalmente, solo las
macros de la biblioteca Standard se cargan con OpenOffice.org. Para cargar alguna otra
bilbioteca, escoja Herramientas => Macros => Macro, seleccione el recipiente y haga una
doble pulsación de ratón sobre el nombre de la biblioteca.
Para las bibliotecas Standard, el método de exportación no funciona adecuadamente, pues el
recipiente soffice posee su propia bibliotecas Standard. En este caso debemos usar los recur-
sos de edición del IDE Basic para compartir la macro.
Active el IDE Basic y cree un nuevo módulo en la biblioteca Standard del recipiente soffice.
Seguidamente, abra el documento con la macro y, en el IDE Basic, active el módulo que con-
tiene la macro a compartir, seleccione toda la macro y copie; cambie al nuevo módulo en sof-
fice / Standard y pegue la macro copiada; guarde todo y cierre OpenOffice. Ahora su macro
forma parte de la biblioteca Standard de soffice y está disponible para su ejecución en
OpenOffice.org.
Si es su intención desarrollar macros para uso compartido, cree bibliotecas propias para
ellas, sobretodo si usan diálogos. Para crear una nueva biblioteca, en el diálogo Administrar
(figura 4), pulse sobre el botón Nuevo, emerge el diálogo Nueva Biblioteca, en el cuadro de
texto introduzca un nombre para su biblioteca y pulse sobre el botón Aceptar.
El SDK (Software Delevopment Kit) de OpenOffice.org proporciona la herramienta pkgchk
para empaquetamiento de macros, y su uso está fuera del ámbito de esta Introducción. Con-
sulte la Developers Guide para obtener información más detallada.
2 Diálogos Personalizados
2.1 Introducción
OpenOffice.org Basic permite la creación de Cuadros de Diálogo Personalizados, gracias a un
poderoso e intuitivo editor de Diálogos que incorpora.
Los Cuadros de Diálogo son una excelente solución para interactuar con el usuario, permitien-
do que el programador diseñe una interface gráfica consistente para obtener o mostrar infor-
maciones al operador.
El Cuadro de Diálogo que vamos a crear será bien simple. Realmente, tan sólo sustituiremos
el cuadro de entrada usado en nuestra primera macro por un cuadro de diálogo personalizado.
Antes de comenzar, precisamos recuperar nuestro archivo Primera_Macro.sxw:
a) Cargue OpenOffice.org.
b) Abra el archivo Primera_Macro.sxw.
c) Desde el menú, escoja Herramientas => Macros => Macro, seleccione el Module1 de
nuestra macro y puse sobre editar para activar el IDE Basic.
d) Pulse con el botón secundario del ratón sobre la pestaña Module1. En el menú contextual
seleccione Insertar => Diálogo. Aparece el editor de cuadros de diálogo Basic, con un diálo-
go vacío. Observe que se ha creado una página denominada Dialog1.
e) Pulse sobre el icono Campos de control . Aparecerá un cuadro con diversos iconos.
Arrastre este cuadro para que quede situado a la derecha del cuadro de diálogo.
Veamos la finalidad de algunos de los iconos existentes en el cuadro de Controles.
Etiqueta – usado para colocar etiquetas en el cuadro de diálogo.
Botón – usado para colocar botones en el cuadro de diálogo.
Campo de texto – permite insertar un cuadro de texto en un diálogo.
Propiedades – muestra la ventana de propiedades del control seleccionado. Se activará cada
vez que seleccionemos un control. Además de la edición de las propiedades, permite asociar
procedimientos (código) a los eventos ocurridos en el control.
Activar el modo de prueba– muestra el cuadro de diálogo como si estuviese en ejecución.
Insertar controles en un cuadro de diálogo es una operación en tres pasos:
1) activar el icono del control en el cuadro de controles;
2) definir un área del cuadro de diálogo donde ubicar el control. Para esto presione el botón
principal del ratón y arrastre formando un rectángulo; entonces, libere el botón del ratón;
3) definir las propiedades del control.
Cuando añadimos un control al cuadro de diálogo, OpenOffice.org Basic automáticamente
define un valor predefinido para cada propiedad. Para mostrar las propiedades de un control
seleccionado, pulse sobre el icono Propiedades o efectúe una doble pulsación sobre el mis-
mo. Observe que la ventana Propiedades, dispone de una barra de desplazamiento vertical.
Vamos a trabajar en nuestro cuadro de diálogo:
a) Seleccione el cuadro de diálogo vacío, pulsando en su borde exterior. Observe las marcas
que aparecen en su perímetro. Podemos usar estas marcas para redimensionar nuestro cuadro
de diálogo.
b) Pulse sobre el icono Propiedades para mostrar su ventana como en la figura 7. En el cam-
po Titulo – pestaña General – escriba Insertar Frase y pulse Intro. Aparte la ventana de forma
que le permita ver el cuadro de diálogo y observe su título.
c) Añada un control Etiqueta al cuadro de diálogo. Para ello, pulse en el icono Etiqueta, y a
continuación defina un rectángulo en la parte superior del cuadro de diálogo. Defina su pro-
piedad Título con el texto Introduzca el texto.
f) Ajuste el cuadro de diálogo y sus controles de modo que queden con la apariencia de la fi-
gura 8.
Finalmente, terminamos nuestro cuadro de diálogo. Verificaremos su apariencia en ejecución;
para ello pulse sobre el icono Activar el modo de prueba en el cuadro de controles y, tras
observar el resultado, ciérrelo para regresar al editor.
En la próxima sección, daremos funcionalidad a nuestro cuadro de diálogo.
Sub dlgEjecutaDialogo
oDialogo = createUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo.execute()
End Sub
Sub dlgCancelaDialogo
oDialogo.endExecute()
End Sub
Sub dlgInsertarFrase
Dim oDocumento as Object
Dim oTexto as Object
Dim oCursorVista as Object
Dim oCursor as Object
Dim sFrase as String
oDialogo.endExecute()
' observe la referencia al control TextField1 del cuadro de diálogo
sFrase = oDialogo.Model.TextField1.Text
oTexto = oDocumento.getText()
' obtiene la posición do cursor en la GUI y crea un cursor de texto
oCursorVista = oDocumento.getCurrentController().getViewCursor()
oCursor = oTexto.createTextCursorByRange(oCursorVista.getStart())
' inserta el texto en la posición actual del cursor
oTexto.insertString(oCursor, sFrase, FALSE)
End Sub
En el código anterior, declaramos una variable oDialogo (Private oDialogo as Variant) fuera
de los procedimientos, lo que la vuelve visible para todo el módulo Module1.
Antes de mostrar el cuadro de dialogo, creamos un objeto oDialogo con createUnoDialog() y,
para ejecutarlo, llamamos a su método execute. Para cerrar el cuadro de diálogo llamamos a
su método endExecute (es llamado en dos procedimientos). Los objetos UNO (creados con
createUno) se deben declarar como de tipo Variant y no Object.
A continuación, asociaremos los procedimientos a los eventos del cuadro de diálogo.
Seleccione la página Dialog1 para activar el editor de cuadros de diálogo.
En nuestro cuadro de dialogo, seleccione el botón Aceptar y pulse sobre el icono Propieda-
des. Surge la ventana Propiedades, pulse la pestaña Acontecimientos (Eventos), y seguida-
mente el botón a la derecha del campo de evento Al ejecutar. Aparecerá la ventana Asig-
nar macro con el evento Al ejecutar seleccionado. En el árbol Macros, expanda las entradas
Primera_Macro.sxw y Standard y pulse en Module1. Al aparecer la relación de proce-
dimientos del módulo, seleccione el procedimiento dlgInsertarFrase y pulse sobre el botón
Asignar. Para cerrar la ventana pulse el botón Aceptar.
Ahora, repita los pasos anteriores para asignar el procedimiento dlgCancelaDialogo al evento
Al ejecutar del botón Cancelar.
Para OpenOffice.org Basic, el primer procedimiento en el módulo es el punto de entrada de la
macro. Por tanto, el procedimiento Sub dlgEjecutaDialogo se ejecutará automáticamente to-
das las veces que llamemos a nuestra macro.
Pruebe la macro y el cuadro de diálogo personalizado, pulsando sobre el icono Ejecutar, en la
barra de herramientas del IDE Basic. Introduzca una frase cualquiera en el cuadro de texto del
diálogo y pulse Aceptar. Tras la ejecución de la macro, verifique que la frase fue añadida
correctamente al documento.
En el próximo capítulo, transformaremos nuestro sencillo cuadro de diálogo en un Piloto Au-
tomático.
3 Pilotos Automáticos
3.1 Introducción
Un Piloto Automático es un Diálogo mostrado en varios pasos. Es una forma eficiente de
guiar al usuario en la ejecución de una tarea.
OpenOffice.org trae de serie varios Pilotos Automáticos. Compruebe el funcionamiento de
uno de ellos, seleccionando Archivo => Piloto Automático => Carta.
En la barra de herramientas del IDE Basic, pulse el icono Controles y ubique el cuadro de
controles al lado del dialogo.
Pulse en el icono Botón, en el cuadro de controles y añada dos nuevos botones en el dialogo, a
la misma altura del botón Aceptar, más a su izquierda.
Seleccione el botón CommandButton3, pulse en el icono Propiedades, defina la propiedad
Título como << Anterior, y cambie el valor de la propiedad Activado a No.
Seleccione el botón CommandButton4 y defina su propiedad Título como Próximo >>.
Seleccione el botón Aceptar y modifique su Título a Finalizar.
Seleccione el diálogo (pulsando en su borde) y defina su propiedad Página (Step) como 1
(uno).
Seleccione el control Etiqueta y defina su propiedad Página como 1 (uno).
Seleccione el control Cuadro de texto y defina su propiedad Página como 1 (uno).
Ahora, retoque la primera página del Piloto Automático, dejándola de forma parecida a la si-
guiente figura:
Bien, sigamos con nuestro proyecto, diseñando la Página 2 del Piloto Automático.
Seleccione el diálogo y altere la propiedad Página en 2 (dos). Observe que los controles Eti-
queta y Cuadro de Texto desaparecen, pues ellos pertenecen a la Página 1. Los botones, que
tienen la página igual a 0 (cero), continúan visibles.
Añada una Etiqueta en la parte superior izquierda del diálogo y defina su Titulo como Selec-
cione una posición. Observe que la propiedad página es igual a 2 (dos), el mismo valor del
diálogo.
Pulse sobre el icono Botón de Opción, en el cuadro de controles, y ponga tres botones de op-
ción en la parte superior derecha del diálogo, uno bajo el otro.
Defina el Título del primer botón de opción como En la posición del cursor y su propiedad
Estado en Seleccionado. Defina el Título del segundo botón de opción como Al principio
del documento. Defina el Título del tercer botón de opción como Al final del documento.
Ahora, ajuste los controles de la segunda página del Piloto Automático, para que adopte una
apariencia similar a la de la siguiente figura. Observe que el botón de opción En la posición
del cursor aparece activada por omisión. La activación o desactivación de los botones Ante-
rior y Siguiente se efectuará en tiempo de ejecución, por el código fuente que más adelante
insertaremos.
Para finalizar el diseño del Piloto Automático, seleccione el diálogo y regrese a la Página 1
(uno), pues OpenOffice.org, por omisión, mostrará la última página accedida desde el Editor
de Diálogos.
En la próxima sección, añadiremos el código fuente necesario para dar funcionalidad al Piloto
Automático.
Sub dlgSiguienteDialogo
oDialogo.Model.Step = 2
oDialogo.Model.CommandButton3.Enabled = true
oDialogo.Model.CommandButton4.Enabled = false
End Sub
Sub dlgAnteriorDialogo
oDialogo.Model.Step = 1
oDialogo.Model.CommandButton3.Enabled = false
oDialogo.Model.CommandButton4.Enabled = true
End Sub
Ahora, conectaremos los procedimientos con los eventos que nos interesan.
Cambie al editor de diálogos.
Seleccione el botón Anterior y pulse en el icono Propiedades. En la ventana Propiedades,
pulse la pestaña Acontecimientos (Eventos) y seguidamente pulse el botón a la derecha
del campo del evento Al Ejecutar. En la ventana Asignar macros, expanda la entrada Pri-
mera_Macro.sxw y Standard de la lista Macros y pulse en Module1. En la relación de su-
brutinas, seleccione el procedimiento dlgAnteriorDialogo y pulse el botón Asignar. Pulse
Aceptar para cerrar la ventana.
Siguiendo los mismos pasos detallados anteriormente, asigne el procedimiento dlgSiguiente-
Dialogo al evento Al Ejecutar del botón Siguiente.
Ejecute la macro y compruebe que todo ocurrió como se esperaba.
Ahora, ya puede usted aventurarse a escribir sus propias macros. Como punto de partida,
consulte el próximo capítulo en busca de información complementaria.
4.1 Introducción
La clave para la creación de programas que usan la API de OpenOffice.org son los servicios.
Un servicio es una especificación de un objeto, que engloba un conjunto de interfaces y pro-
piedades. Una interfaz es una colección de métodos. Una propiedad es un valor que deter-
mina una característica de un servicio y está formada por un nombre y un valor.
Para crear un servicio, usamos la función Basic createUnoService(), que devuelve un objeto
que soporta el servicio, o Null si no fuese posible la creación. Por ejemplo, para obetener el
servicio Desktop usamos la llamada:
oDesktop = createUnoService( “com.sun.star.frame.Desktop” )
Existen servicios que son dependientes de un contexto. Por ejemplo, usted no puede crear una
celda fuera de una hoja de cálculo. Otros servicios no necesitan un ambiente para operar.
Existen, además, servicios que no ofrecen ninguna interfaz, sirviendo únicamente para obtener
y definir propiedades.
Basic ofrece dos propiedades que facilitan el acceso a los servicios:
StarDesktop – es el equivalente al objeto devuelto por una llamada a la función createUno-
Service(“com.sun.star.frame.Desktop”). Introduzca el siguiente código en una nueva subruti-
na, ejecute y observe el resultado:
MsgBox StarDesktop.Dbg_SupportedInterfaces
'
' es lo mismo que:
'
Dim oDesktop
oDesktop = CreateUnoService( "com.sun.star.frame.Desktop" )
MsgBox oDesktop.Dbg_SupportedInterfaces
ThisComponent – devuelve el objeto documento que contiene el código Basic; existe sola-
mente en documentos Writer, Calc, Impress o Draw. Algunas de sus interfaces dependen del
tipo de documento.
Dim oDocumento As Object
oDocumento = ThisComponent
OpenOffice.org Basic tiene tres propiedades muy útiles para la inspección de objetos:
Dbg_SupportedInterfaces
devuelve las interfaces soportadas por el objeto
Dbg_Properties
devuelve las propiedades del objeto
Dbg_Methods
devuelve los métodos soportados por el objeto
Para obtener estas propiedades, use la forma Objeto.Propiedad. Por ejemplo, compruebe las
interfaces soportadas por el modelo de documento ejecutando el siguiente código:
Sub Main
MsgBox ThisComponent.Dbg_SupportedInterfaces
End Sub
mPropArchivo(1).Value = True
Las filas iniciada por la orden Dim declaran todas las variables usadas por la subrutina.
Para cargar un archivo, usamos el método loadComponentFromURL( ), que es definido por
una interfaz del servicio Desktop. Luego, necesitamos un objeto UNO Desktop, declarado en
la línea Dim oDesktop As Variant. Aquí, el tipo Variant sigue una recomendación de la Guía
de Desarrolladores para la declaración de objetos UNO.
La variable sUrl (tipo String) recibe una especificación completa del camino para el archivo.
Se pasará como argumento del método loadComponentFromURL( ).
El método loadComponentFromURL( ) devuelve un objeto Document. La línea Dim
oDocumento As Object reserva memoria para este objeto.
Siguen las descripciones para algunas de las posibles propiedades (existen varias):
Esto es todo, analice nuevamente el código de Sub creaNuevoDocumento, del capítulo ante-
rior.
Los documentos abiertos con loadComponentURL ( ), deben usar los métodos storeAsURL o
storeToURL.
Como ejemplo, introduzca (o copie y pegue) el siguiente código fuente, tras la línea
' INSERTAR CÓDIGO PARA SALVAR AQUÍ
de Sub creaNuevoDocumento ( ), edite la variable sUrl de acuerdo con su sistema, ejecute la
macro y verifique que un nuevo archivo fue escrito en sURL.
' ------------------------
' Escribe el nuevo archivo
' ------------------------
Tenemos, también los métodos siguientes, relacionados con la tarea de salvar archivos:
isModified() As Boolean
Devuelve True (Verdadero) si el recurso fue modificado; si no, devuelve False.
hasLocation ( ) As Boolean
Devuelve True (Verdadero) si el archivo ya existe (fue grabado); de lo contrario devuelve
False.
GetLocation ( ) As String
Devuelve un String con la URL del recurso.
isReadonly ( ) As Boolean
Devuelve True (Verdadero) si el recurso está abierto para sólo lectura, en caso contrario de-
vuelve False.
A continuación, tenemos un fragmento de código más elaborado para salvar archivos:
If (oDocumento.isModified) Then
If (oDocumento.hasLocation And (Not oDocumento.isReadOnly)) Then
oDocumento.store()
Else
oDocumento.storeAsURL(sURL, mPropArquivo())
End If
End If
Propiedad Descripción
Name Una cadena (String) con el nombre de la impresora.
PaperOrientation Contiene la orientación del papel
PaperFormat Especifica un tamaño de papel predefinido o definido por
el usuario
PaperSize Especifica el tamaño de papel en 1/100 mm.
IsBusy True (Verdadero) si la impresora está ocupada; False en
caso contrario
CanSetPaperOrientation True (Verdadero) si la impresora permite cambiar la
orientacióndel papel
CanSetPaperFormat True (Verdadero) si la impresora permita cambiar el for-
mato de papel
CanSetPaperSize True (Verdadero) si la impresora permite cambiar el ta-
maño del papel
Las últimas cuatro propiedades son de sólo lectura..
Veamos un ejemplo que accede a las propiedades de la impresora actual:
Sub obtieneDescriptorImpresora
Dim oDoc As Object
Dim oDescImpr As Variant
Dim sMsg As String
oDoc = ThisComponent
' obtiene array de estructuras PrinterDescriptor
oDescImpr = oDoc.getPrinter()
' obtiene tamaño del array de estructuras
iNumEstructuras% = UBound(oDescImpr)
' extrae los nombres de las propiedades de la impresora
For n = 0 To iNumEstructuras%
sMsg=sMsg + oDescImpr(n).Name + " "
Next n
' muestra los nombres de las propiedades
MsgBox sMsg,0,"Propiedades Impresora"
' obtiene y muestra el valor de la propiedad PageFormat
' A3=0; A4=1; Letter/Carta=5; ...
MsgBox oDescImpr(2).Value
' comprueba si PageFormat se puede modificar
If oDescImpr(6).Value Then
MsgBox "Formato de Página, ¡puede ser modificado!"
' entonces lo modifica a A4
oDescImpr(2).Value = 1
Else
MsgBox "Formato de Página, ¡no puede ser modificado!"
End If
' muestra nuevamente el valor de PageFormat
MsgBox oDescImpr(2).Value
End Sub
El código anterior llama al método getPrinter ( ) para obtener las propiedades de la impresora
actual. Seguidamente, en el bucle For ... Next, extrae los nombres de cada propiedad. Y, a
continuación, obtiene y altera el formato de página, si es posible.
Para imprimir en una impresora diferente de la predefinida, usted necesita alterar la propiedad
“Name” de la impresora y llamar a setPrinter definiendo una nueva impresora, tal como sigue:
Dim mImpresora(0) As New com.sun.star.beans.PropertyValue
Dim aOpciones() ' solamente para pasar el argumento
'
mImpresora(0).Name="Name"
mImpresora(0).value="Segunda_Impresora"
' define una nueva Impresora para el objeto,
' puede ocurrir un reformateado del documento
oDocumento.setPrinter = mImpresora()
' imprime con las opciones predefinidas
oDocumento.print( aOpciones() )
Añada la línea anterior tras la última linea de Sub creaNuevoDocumento( ), ejecute la macro
y observe el resultado.
b) Abierto por la interfaz de usuario de OpenOffice.org
Si el documento se cargó con la orden Archivo => Abrir de OpenOffice.org y no hubiese una
definición de un objeto Document, use la propiedad ThisComponent, como sigue:
ThisComponent.dispose()
oComponentes = StarDesktop.getComponents().createEnumeration()
n = 0
Do While (oComponentes.hasMoreElements())
oComp = oComponentes.nextElement()
' no todos los componentes son modelos con una URL
6 Documentos de Writer
6.1 Introducción
En este capítulo, veremos como efectuar tareas simples de procesamiento de texto como: edi-
ción, formateo, búsqueda y reemplazo.
Abordaremos la cuestión mediante ejemplos prácticos, con una breve explicación de los as-
pectos más importantes.
Un documento de Writer contiene principalmente texto, organizado en párrafos y tablas.
Además de estos elementos básicos, soporta marcos, objetos incrustados, campos, imágenes,
marcadores, índices y muchos otros objetos. Estos datos conforman un modelo de docu-
mento.
Mediante el modelo, podemos manipular los datos independientemente de su representación
visual. Para manejar el aspecto visual del documento, el modelo dispone de un objeto con-
trolador.
Algunos elementos de un documento (gráficos, marcos, etc) son nombrados y están anclados
en un párrafo, carácter o página. Los párrafos no reciben ni nombre ni índice, de modo que su
acceso debe ser secuencial.
oDoc = ThisComponent
oTxt = oDoc.getText()
sStr = "Esta es una "
oTxt.setString( sStr )
oTxtRange = oTxt.getEnd()
sStr = "cadena de caracteres "
oTxtRange.setString( sStr )
End Sub
En este ejemplo, usamos la interfaz XTextRange para editar texto. Sus métodos son:
getText( ) As Text
devuelve un objeto Text
getString( ) As String
devuelve un String contenido en el objeto
setString( sStr As String )
define un String con el contenido del objeto
getStart( ) As Object <TextRange >
devuelve un objeto TextRange apuntando al inicio del objeto que le llama
getEnd( ) As Object <TextRange>
devuelve un objeto TextRange apuntando al final del objeto que le llama
Inicialmente, llamamos al método getText( ), que devuelve un objeto Text, paso correspon-
diente al punto b) anterior.
Seguidamente, en la línea oTxt.setString(sStr), definimos una cadena de caracteres para nues-
tro objeto Text, esto quiere decir que todo el contenido del documento – objeto oTxt – será
sustituido por la cadena sStr de setString. Antes de insertar más texto, precisamos obtener el
final del contenido de oTxt con la llamada al método getEnd( ) y usar este nuevo objeto –
TextRange – para insertar más texto. A través del método getStart( ), podríamos insertar texto
al principio del contenido.
Observe, además, que las variables de los servicios Text y TextRange se declaran como
Object.
Atención, oTxt también es un TextRange, así que podemos sustituir la variable oTxtRange
por el encadenamiento de métodos siguiente:
oTxt.getEnd ().setString ( sStr )
Este proceso de edición es muy limitado. Tan sólo podemos sustituir todo el contenido del
texto e insertar texto al inicio o final del documento. Veamos como mejorar esto en la próxi-
ma sección.
El alcance de un cursor tiene un inicio y un final, que puede abarcar un rango variable de texto
o coincidir en un mismo punto. El alcance del cursor puede ser expandido con el desplaza-
miento del mismo.
En Writer, además del cursor de texto, tenemos también: cursor de palabra, cursor de senten-
cia y cursor de párrafo, todos ellos derivados del cursor de texto.
Veamos, ahora, las interfaces y métodos usados para flexibilizar la edición de texto.
La interfaz XSimpleText, derivada de XTextRange, se usa en la creación del cursor de texto,
en la inserción de cadenas y de caracteres de control, y posee los siguientes métodos::
createTextCursor ( ) As Object <TextCursor>
Devuelve un objeto cursor de texto (al principio del contenido).
createTextCursorByRange (aPos As TextRange) As Object <TextCursor>
Crea un objeto cursor de texto en la posición especificada por el argumento.
insertString(aPos As TextRange, sStr As String, bFlag As Boolean)
Inserta la cadena en la posición. Si bFlag fuese True (Verdadero) el contenido de aPos será
sustituido por sStr; si no, sStr se añadirá al final de aPos.
insertControlCharacter( aPos As TextRange, iChar As Integer, bFlag As Boolean )
Insertar un carácter de control en la posición aPos.
El servicio TextCursor, a través de la interfaz XTextCursor, suministra métodos para el con-
trol del estado y movimiento del cursor.
a) Métodos para mover el cursor:
goLeft (iNumChar As Integer, bExpande As Boolean) As Boolean
mueve el cursor a la izquierda iNumChar caracteres
goRight (iNumChar As Integer, bExpande As Boolean) As Boolean
mueve el cursor a la derecha iNumChar caracteres
gotoStart (bExpande As Boolean)
mueve el cursor al principio del texto
gotoEnd (bExpande As Boolean)
mueve el cursor al final del texto
gotoRange (xRange As <TextRange>, bExpande As Boolean)
mueve o expande el cursor sobre el objeto TextRange
En todos los métodos anteriores, si bExpande es True (Verdadero) se expandirá el alcance del
cursor.
b) Métodos para controlar el estado del cursor:
collapseToStart ( )
mueve la posición de final del cursor hasta el inicio del mismo
collapseToEnd ( )
mueve la posición de inicio del cursor hasta el final del mismo
isCollapsed ( ) As Boolean
devuelve True (Verdadero) si coinciden las posiciones inicial y final del cursor.
b) Métodos de XSentenceCursor:
gotoNextSentence (Expande As Boolean) As Boolean
gotoPreviousSentence (bExpande As Boolean) As Boolean
gotoStartOfSentence (bExpande As Boolean) As Boolean
gotoEndOfSentence (bExpande As Boolean) As Boolean
isStartOfSentence ( ) As Boolean
isEndOfSentence ( ) As Boolean
c) Métodos de XParagraphCursor:
gotoStartOfParagraph (bExpande As Boolean) As Boolean
gotoEndOfParagraph (bExpande As Boolean) As Boolean
gotoNextParagraph (bExpande As Boolean) As Boolean
gotoPreviousParagraph (bExpande As Boolean) As Boolean
isStartOfParagraph ( ) As Boolean
isEndOfParagraph ( ) As Boolean
Antes de presentar un ejemplo, veamos los caracteres de control que pueden ser insertados en
un documento de Writer. En la interface gráfica, se les denomina caracteres no imprimibles y
tienen funciones especiales en la presentación final del documento.
Para facilitar su empleo, estos caracteres están definidos como constantes, en el grupo de
constantes com.sun.star.text.ControlCharacter. Pueden ser insertados en el texto con el méto-
do insertControlCharacter ( ) o como parte del contenido de una cadena, en este caso, usando
su código Unicode.
Esta es una relación de los caracteres de control con sus respectivos códigos:
Sub procesaTexto
Dim oDesktop As Variant
Dim oDoc As Object
Dim oCursor As Object
Dim oTexto As Object
Dim mPropArchivo()
Dim sStr As String
oDesktop = createUnoService("com.sun.star.frame.Desktop")
oDoc = oDesktop.loadComponentFromURL("private:factory/swriter",_
"_blank", 0, mPropArchivo())
oTexto = oDoc.getText()
oCursor = oTexto.createTextCursor()
sStr = "Éste es el texto del primer párrafo del documento"
With oTexto
' inserta el texto en la posición actual del cursor
.insertString(oCursor, sStr, False)
' insertar un salto de párrafo
.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
.insertString(oCursor, "Éste es el segundo párrafo", False)
.insertControlCharacter(oCursor, _
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
End With
' inserta una nueva página
oCursor.gotoStartOfParagraph(True)
oCursor.breakType = com.sun.star.style.BreakType.PAGE_BEFORE
oTexto.insertString(oCursor, "Estoy en una nueva página.", False)
' mueve el cursor sin expansión
oCursor.gotoStart(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
' mueve el cursor expandiendo, selecciona “texto de”
oCursor.gotoNextWord(True)
oCursor.gotoNextWord(True)
' sustituye el texto entre el principio y el final del cursor
oTexto.insertString(oCursor, "", True)
End Sub
En el código anterior, estudie el empleo del argumento bExpande (True o False), pues es muy
importante.
Otro aspecto es la inserción de salto de página. No existe un carácter de control para salto de
página o columna. Esa es una propiedad del párrafo. Observe que usamos oCursor para defi-
nir una propiedad del párrrafo (oCursor.breakType). Esto es posible porque el objeto Text-
Cursor hereda las características de TextRange.
Los posibles valores para la propiedad breakType (salto de página y columna) se enumeran en
com.sun.star.style.BreakType, aquí usamos PAGE_BEFORE.
Finalmente, observe en el nuevo documento que el cursor de vista se encuentra al final del
mismo, a pesar de la última acción (selección y reemplazo) ha ocurrido en el primer párrafo,
lo que demuestra la independencia entre el cursor de texto y la interfaz gráfica.
Recuerde, además, que el acceso a la interfaz gráfica se da a través del controlador del modelo
de documento. El código fuente de la subrutina dlgInsertarFrase, del Capítulo 3 (Piloto Au-
tomático), muestra como acceder al controlador y crear un cursor de vista.
Nuevamente, las referencias com.sun.star contienen posibles valores para las respectivas pro-
piedades, generalmente un valor de 0 a n para constantes. Veamos algunas de ellas:
Constantes de com.sun.star.style.ParagraphAdjust: LEFT, RIGHT, BLOCK, CENTER e
STRETCH.
Constantes de com.sun.star.text.ParagraphVertAlign: AUTOMATIC, BASELINE, TOP,
CENTER e BOTTOM.
Existen muchas otras propiedades para caracteres y párrafos, una consulta a la Guía para De-
sarrolladores o al Manual de Referencia, ambos de Sun Microsystems Inc., es indispensable
para quienes deseen programar en OpenOffice.org
Volvamos a nuestro último ejemplo Sub procesaTexto. Deseamos cambiar la inclinación y
color de fuente de la palabra “segundo” y, también, el estilo de un párrafo de estilo Título.
Introduzca el siguiente código, tras la última línea de la subrutina, ejecútela y observe el re-
sultado.
' ----------------------
' código para formateado
' ----------------------
oCursor.gotoNextParagraph(FALSE)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(True)
oCursor.CharPosture = com.sun.star.awt.FontSlant.REVERSE_ITALIC
oCursor.CharColor = RGB(255,0,0)
' aplica estilo de párrafo
oCursor.gotoNextParagraph(FALSE)
oCursor.paraStyleName = "Heading"
con.sun.star.container.XIndexAcess
getCount ( ) As Long
getByIndex ( nIndice As Long ) As Variant
con.sun.star.container.XNameContainer
insertByName ( sNombre As String, oElemento As Variant)
removeByName ( sNombre As String )
Propiedad Descripción
Height Valor Long especificando la altura de la página en 1/100 mm
HeaderLeftMargin Valor Long especificando el margen izquierdo del encabezado
en 1/100 mm
HeaderRightMargin Valor Long definiendo el margen derecho del encabezado en
1/100 mm
HeaderIsOn Determina si el encabezado está activo (True / False)
FooterLeftMargin Valor Long especificando el margen izquierdo del pie de página
en 1/100 mm
FooterRightMargin Valor Long especificando el margen derecho del pie de página
en 1/100 mm
FooterIsOn Determina si el pie de página está activo (True / False)
oDoc = ThisComponent
' obtiene la Familia de Estilos (observe el uso de oDoc)
oFamiliaEstilos = oDoc.StyleFamilies
' obtiene los Estilos de Página
oEstilosPagina = oFamiliaEstilos.getByName("PageStyles")
' muestra el número de Estilos de Página
MsgBox oEstilosPagina.Count
' obtiene y muestra los nombres de los Estilos de Página
mNombresEstilosPagina = oEstilosPagina.getElementNames()
For n = LBound(mNombresEstilosPagina) To UBound(mNombresEstilosPagina)
sMsg=sMsg + mNombresEstilosPagina(n) + " "
Next n
MsgBox sMsg,0,"Estilos de Páginas"
' obtiene el Estilo de Página Predefinido (Standard)
oPaginaPredefinida = oEstilosPagina.getByName("Standard")
End Sub
A destacar, el acceso mediante índice dentro del bucle For ... Next, el acceso nominal al estilo
de página “Standard” y el acceso a la propiedad Size.
Observe, también, la llamada al método getStylesFamilies():
oFamiliaEstilos = oDoc.StylesFamilies
en OpenOffice.org Basic usted puede omitir el get y el set al programar propiedades.
Este ejemplo puede usarse como modelo para diversas operaciones con estilos.
Durante el formateo de texto, es habitual la creación y aplicación de nuevos estilos. Esta es
una tarea fácil de ejecutar dentro de una macro. Para ello seguiremos los pasos:
a) Obtener las familias de estilos del documento;
b) Obtener la familia del grupo donde será creado el nuevo estilo;
c) Crear una instancia de objeto del nuevo estilo;
d) Añadir el nuevo estilo al grupo;
e) Especificar las propiedades del nuevo estilo;
f) Aplicar el nuevo estilo.
Volveremos a tomar la subrutina Sub procesaTexto y añadiremos un nuevo estilo de párrafo.
Introduzca (o copie y pegue) el siguiente código, tras la última línea de la Sub procesaTexto,
ejecute la macro y observe las definiciones de estilo del primer párrafo del documento.
' ------------------------
' código para nuevo estilo
' ------------------------
Dim oFamiliasEstilos As Object
Dim EstilosParrafo As Object
Dim oNuevoEstilo As Object
' obtiene las familias de Estilos
oFamiliasEstilos = oDoc.StyleFamilies
' obtiene los estilos de párrafo
EstilosParrafo = oFamiliasEstilos.getByName("ParagraphStyles")
' crea un nuevo estilo de párrafo
oNuevoEstilo = oDoc.createInstance("com.sun.star.style.ParagraphStyle")
' añade el nuevo estilo con el nombre "nuevo_estilo"
EstilosParrafo.insertByName("nuevo_estilo",oNuevoEstilo)
' especifica las propiedades del estilo
oNuevoEstilo.Name = "nuevo_estilo"
oNuevoEstilo.CharFontName = "Arial"
oNuevoEstilo.CharHeight = 16
oNuevoEstilo.ParaAdjust = com.sun.star.style.ParagraphAdjust.CENTER
oNuevoEstilo.CharWeight = com.sun.star.awt.FontWeight.BOLD
' entonces, aplica el nuevo estilo al primer párrafo
oCursor.gotoStart(FALSE)
oCursor.gotoEndOfParagraph(TRUE)
oCursor.paraStyleName = "nuevo_estilo"
Del código anterior, observe la creación de un nuevo objeto, en este caso una instancia de un
estilo de párrafo, mediante la llamada al método createInstance(...), así como la definición de
las propiedades del nuevo estilo.
oDoc = ThisComponent
oSel = oDoc.getCurrentSelection()
For i = 0 To oSel.Count-1
oCurTxt = oSel(i)
oCurTxt.CharColor = RGB(255,0,0)
Next i
MsgBox oSel.Count
End Sub
El método getString() devuelve una cadena vacía para el primer objeto en los casos a) y c)
anteriores. Inserte el código inferior en el bucle For ... Next de procesaSeleccion y observe la
salida:
MsgBox Str$(i) + ": " + oSel(i).getString()
Si quiere usted efectuar alguna acción en la palabra sobre el cursor de vista, haga:
If Len(oSel(0).getString())= 0 Then
oCurTxt = oSel(0).Text.createTextCursorByRange(oSel(0).getStart())
oCurTxt.gotoStartOfWord(False)
oCurTxt.gotoEndOfWord(True)
End If
Analice como se crea el cursor de texto. Seguidamente, como ejercicio, haga que la Sub pro-
cesaSeleccion aplique un color también en la palabra sobre el cursor de vista.
La API de OpenOffice.org tiene, también, la interfaz com.sun.star.view.XSelectionSupplier,
que implementa algunos métodos de selección para la interfaz gráfica, entre ellos:
select ( oObjeto As Object ) As Boolean
si es posible, selecciona el objeto oObjeto en la interfaz gráfica.
getSelection ( ) oObjeto As Variant
obtiene la selección en la interfaz gráfica, puede devolver un objeto o una colección de obje-
tos.
Estos métodos pueden ser llamados mediante el controlador actual del modelo (vea la sección
de código más adelante).
Existen, además, dos métodos que pueden ser útiles para la identificación del contenido selec-
cionado, son:
getImplementationName ( ) As String
devuelve el nombre de la implementación del objeto
getName ( ) As String
devuelve el nombre del objeto, si el mismo estuviese nombrado, caso de gráficos y tablas.
Dim oControlador As Object
oControlador = oDoc.getCurrentController()
oSel = oControlador.getSelection()
sNomeImpl = oSel.getImplementationName()
sNome = oSel.getName()
Ahora, modifique Sub procesaSeleccion, para avisar al usuario cuando él seleccione algo
diferente de texto (pista: use getImplementationName).
oGraficos = ThisComponent.getGraphicObjects()
For n = 0 To oGraficos.Count -1
oGrafico = oGraficos (n)
MsgBox oGrafico.getName()
Next n
MsgBox "Gráficos en el documento: " + Str$(oGraficos.Count)
End Sub
Para eliminar una imagen de su documento, puede usted usar el siguiente bloque de código:
oGrafico = oGraficos.getByName (“Gráfico2”)
oGrafico.dispose ()
Como ejemplo de como trabajar con enumeraciones, mediante el siguiente código mostrare-
mos el comando de cada uno de los campos de un documento:
Sub localizaCampos
oCampos = ThisComponent.getTextFields().createEnumeration()
n = 0
Do While (oCampos.hasMoreElements())
oCampo = oCampos.NextElement()
MsgBox oCampo.getPresentation(True)
n = n + 1
Loop
MsgBox "Campos en el documento: " + Str$(n)
End Sub
oDoc = ThisComponent
oDescBusca = oDoc.createSearchDescriptor()
oDescBusca.SearchWords = True
oDescBusca.setSearchString ("( )")
oResultado = oDoc.findAll( oDescBusca )
For n% = 0 To oResultado.Count - 1
oResultado(n%).CharColor = RGB(255,0,0)
Next
MsgBox "Ocurrencias de " + oDescBusca.getSearchString() + _
" " + Str$(oResultado.Count)
End Sub
La tarea anterior, también puede ser completada mediante el uso de los métodos findFirst y
findNext:
oResultado = oDoc.findFirst( oDescBusca )
Do Until IsNull(oResultado)
oResultado.CharColor = RGB(250,100,50)
oResultado = oDoc.findNext(oResultado, oDescBusca )
Loop
La sustitución de texto está implementada por la interfaz XReplaceable, que hereda las carac-
terísticas de XSearchable. Ella proporciona los métodos:
createReplaceDescriptor ( ) As Object <com.sun.star.util.XReplaceDescriptor>
devuelve un descriptor de reemplazo para las propiedades
replaceAll ( xDescriptor As Object <com.sun.star.util.XReplaceDescriptor>) As Long
busca y reemplaza todas las ocurrencias, devolviendo el total de sustituciones efectuadas.
El servicio ReplaceDescriptor tiene métodos para las propiedades de cadena:
getReplaceString ( ) As String
obtiene la cadena de reemplazo
setReplaceString ( sCadena As String )
especifica la cadena de reemplazo
Veamos un ejemplo sencillo de búsqueda y reemplazo:
Sub sustituyeTodas
Dim oDoc As Object
Dim oDescriptor As Object
oDoc = ThisComponent
oDescriptor = oDoc.createReplaceDescriptor()
oDescriptor.setSearchString( "( )" )
oDescriptor.setReplaceString( "()" )
n = oDoc.replaceAll(oDescriptor)
MsgBox n
End Sub
Para insertar en la posición del cursor de la interfaz gráfica, cree el cursor de texto a partir del
cursor de vista.
La inserción de imágenes es un poco más complicada, para ello usted debe:
a) crear un objeto gráfico;
b) definir sus propiedades;
c) insertar el objeto.
Observe la subrutina Sub insertarGrafico siguiente:
Sub insertarGrafico
Dim oTxt As Object
Dim oCursorTxt As Object
Dim oGrafico As Object
Dim sURL As String
oTxt = ThisComponent.getText()
oCursorTxt = oTxt.createTextCursor()
oGrafico = ThisComponent.createInstance("com.sun.star.text.GraphicObject")
sURL = "file:///D:/NAD/OPENOFFICE/HOWTO/FIGURAS/DIALOGO.JPG"
oGrafico.GraphicURL = sURL
oGrafico.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
oTxt.insertTextContent(oCursorTxt.getStart(), oGrafico, False)
End Sub
La llamada al método createInstance ( ) crea el objeto gráfico, después definimos las propie-
dades GraphicURL e AnchorType y, finalmente, insertamos el gráfico llamando al método
insertTextContent ( ) con los argumentos adecuados.
La propiedad AnchorType puede asumir, además, los siguientes valores: AT_CHARACTER,
AT_PAGE e AS_CHARACTER.
El API de OpenOffice.org (versión 1.0.1) salva en el documento la URL del gráfico. En con-
secuencia si usted lo cambia de su ubicación original, Writer no sabrá como encontrarlo.
6.10 Tablas
Una tabla es un conjunto de celdas organizadas en filas y columnas, donde cada celda tiene un
nombre, normalmente indicado por letras y números. Las letras se refieren a las columnas y
los números a las filas. No obstante, si existiesen celdas unidas o divididas, el concepto de
columna podrá desaparecer y el esquema de nominación se complica.
Una celda puede contener texto simple (cadenas y números), gráficos, fórmulas y campos con
varias características de formateo.
Una tabla recibe un nombre único en el documento, pudiendo servir como origen para gráfi-
cos, tener su contenido ordenado y formatearse automáticamente.
El API de OpenOffice.org tiene diversos servicios e interfaces para manejar tablas, veremos
las principales.
La interfaz com.sun.star.text.XTextTable se encarga de la administración de las tablas en un
documento y contiene los siguientes métodos:
initialize ( nFilas As Long, nColumnas As Long)
Inicializa una tabla , recibe el número de filas y columnas como argumentos.
getCellNames ( ) As Object < Strings >
obtiene los nombres de las celdas, devolviendo un conjunto de cadenas
getCellByName ( sNombreCelda As String ) As Object < com.sun.star.table.XCell >
obtiene la celda nombrada en el argumento, devolviendo un objeto XCell
getRows ( ) As Object < com.sun.star.table.XTableRows >
obtiene las filas de la tabla, devolviendo un objeto XTableRows.
getColumns ( ) As Object < com.sun.star.table.XTableColumns >
obtiene las columnas de la tabla, devolviendo un objeto XTableColumns.
createCursorByCellName ( sNombreCelda As String ) As Object < XTextTableCursor >
crea un cursor de tabla, ubicado en la celda nombrada en el argumento
El servicio TextTable posee diversas propiedades, he aquí algunas de ellas:
Propiedad Descripción
LeftMargin Contiene el margen izquierdo de la tabla, valor Long
RightMargin Contiene el margen derecho de la tabla, valor Long
Split Un valor False impide la división de la tabla en dos pági-
nas
TableBorder Contiene la descripción del borde de la tabla
TableColumnSeparators Contiene la descripción de los separadores de columnas
de la tabla
BackGraphicURL Contiene la URL del gráfico de fondo de la celda
Las interfaces XTableRows e XTableColumns, devueltas por los métodos getRows () y get-
Columns (), además, proveen de los siguientes métodos:
insertByIndex ( nIndice As Long, nTotal As Long )
removeByIndex ( nIndice As Long, nTotal As Long )
getElementType ( ) As Type
hasElements ( ) As Boolean
getByIndex ( ) As Variant
getCount ( ) As Long
2 N. del T.: Todo lo que se describe acerca de las posibilidades de ordenación dentro de la tabla, está comprobado en
OpenOffice.org versión 1.0.3, pero en la versión 1.1.RC no funciona. Todavía no tenemos claro si responde a
alguna modificación en la API, o algún otro tipo de error. En posteriores versiones de este documento quedará
debidamente aclarada esta cuestión.
Primero creamos el objeto tabla con createInstance (), después definimos las filas y columnas
con initialize (), insertamos la tabla en el documento con una llamada al método insertText-
Content ( ) y, entonces, obtenemos cada una de las celdas del encabezado y especificamos su
contenido.
El siguiente bloque de código demuestra el empleo del cursor de tabla, navegación, formateo
y unión de celdas. Añádalo a Sub creaTabla.
'
' crea un cursor de tabla en la celda CellNames(0) = A1
Dim oCurTab As Object
oCurTab = oTab.createCursorByCellName(oTab.CellNames(0))
' selecciona las celdas A1, B1 e C1
oCurTab.gotoStart(FALSE)
oCurTab.goRight(2, True)
' Aplica el estilo de párrafo Título en la selección
oCurTab.paraStyleName = "Heading"
' muestra el nombre de la extensión seleccionada (rango)
' Observe la forma en que se representa (invertida)
MsgBox oCurTab.getRangeName()
'
' nombra las celdas a partir de la línea 2 y
' escribe el número de fila en la columna C
Dim sNombres() As Variant
Dim sNombreCelda As String
sNombres = Array("A","B","C")
For i% = 1 To 4
For j% = 1 To 3
sNombreCelda = sNombres(j%-1)+ Str$(i%+1)
oCelda = oTab.getCellByName(sNombreCelda)
If (j% - 1 = 2) Then
' define un valor numérico para la celda
oCelda.setValue(i% + 1)
Else
oCelda.setString(sNombreCelda)
End If
Next j%
Next i%
'
' define una fórmula (suma de C2 hasta C4) para la celda C5
oCelda = oTab.getCellByName("C5")
oCelda.setFormula("sum <C2:C4>")
'
' une las celdas A5 y B5 y cambia su contenido
oCurTab.gotoCellByName("A5", False)
oCurTab.goRight(1, True)
oCurTab.mergeRange()
oCelda = oTab.getCellByName("A5")
oCelda.setString("Total")
Observe la creación del cursor de tabla con createCursorByCellNames (...), el uso del cursor
para formateo, el uso de los métodos setValue () y setFormula () y la selección y unión de las
celdas A5 y B5.
En el siguiente bloque de código, veremos la ordenación de una extensión de celdas (A2:C4)
de nuestra tabla. Basta insertar el código en Sub creaTabla y ejecutarla nuevamente para ver
el resultado.3
3 N. del T.: Este código funciona perfectamente en la versión 1.0.3 de OpenOffice.org, pero en el momento de escribir
'
' ordena de A2 hasta C4
Dim oCampoOrd(0) As New com.sun.star.util.SortField
Dim oDescrOrd As Variant
Dim oRango As Object
'
' especifica el rango a ordenar
oRango = oTab.getCellRangeByName("A2:C4")
' define el campo de ordenación y sus propiedades
oCampoOrd(0).Field = 0
oCampoOrd(0).SortAscending = False
oCampoOrd(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
' crea el descriptor de ordenación
oDescrOrd = oTab.createSortDescriptor()
' define las propiedades del descriptor
oDescrOrd(0).Name = "SortFields"
oDescrOrd(0).Value = oCampoOrd()
oDescrOrd(1).Name = "ContainsHeader"
oDescrOrd(1).Value = False
oDescrOrd(2).Name = "SortColumns"
oDescrOrd(2).Value = False
' ordena el rango
oRango.sort(oDescrOrd())
Observe que comenzamos por la declaración de las variables, creamos un rango de celdas con
una llamada al método getCellRangeByName (), definimos las propiedades del campo de or-
denación, creamos el descriptor y definimos sus propiedades (el campo de ordenación es una
propiedad del descriptor) y, finalmente, invocamos el método sort () para ejecutar su tarea.
Antes de terminar esta sección, veamos como se obtiene el acceso a las tablas existentes en un
documento de texto. El proceso es el mismo visto en la sección 6.7 Localizando Objetos.
El método getTextTables () de la interfaz XTextTablesSupplier devuelve una colección con-
teniendo las tablas del documento. Este procedimiento recorre el documento de inicio a fin.
getTextTables () As Object <com.sun.star.container.XNameAccess>
El ejemplo inferior muestra la localización de las tablas de un documento, después obtiene las
colecciones de filas y columnas de la tabla de nombre “Tabla3”
Sub localizaTablas
Dim oTablas As Object
Dim oTabla As Object
Dim oFilas As Object
Dim oColumnas As Object
Dim n As Integer
oTablas = ThisComponent.getTextTables()
For n = 0 To oTablas.Count -1
oTabla = oTablas.getByIndex(n)
MsgBox oTabla.getName()
Next n
MsgBox "Tablas en el documento: " + Str$(oTablas.Count)
'
la traducción, adaptándola a la versión 1.1.RC3 nos hemos encontrado con que no funciona. En posteriores
revisiones del presente documento quedará debidamente aclarada esta cuestión.
Recuerde que, para acceder a una tabla, usted debe conocer su nombre o su índice dentro de la
colección, y, seguidamente, llamar al método getByName () o getByIndex ().
Tras obtener la tabla deseada, use las técnicas ya presentadas para editar su contenido.
7 Documentos de Calc
7.1 Introducción
Un documento de Calc contiene una o más hojas de cálculo. Cada hoja de cálculo está forma-
da por celdas organizadas en filas y columnas, de modo parecido a una tabla de Writer. Estas
celdas contienen, básicamente, texto, que puede representar una cadena de caracteres, un valor
numérico, un campo o una fórmula.
Cada uno de los elementos citados (documento, hoja de cálculo y celda), posee características
propias. Algunas pueden ser modificadas como, por ejemplo, el estilo de página, el formato
numérico, de párrafo y de fuente.
Además de tareas comunes de edición, podemos aplicar al contenido de una hoja de cálculo
operaciones como ordenación, filtro, totalización, generación de gráficos, etc.
En una hoja de cálculo también podemos insertar objetos como imágenes, diseños, datos de
una fuente externa y objetos OLE.
Como usted ya habrá observado, dada la riqueza y la potencia de las operaciones con docu-
mentos de Calc, su programación es un asunto extenso. En las próximas secciones, intentare-
mos presentar lo básico.
Para fijar los conceptos anteriores, en el siguiente ejemplo, crearemos un documento y efec-
tuaremos algunas operaciones con hojas.
Sub creaDocCalc
Dim oDesk As Variant
Dim oDoc As Object
Dim mProp() As Variant
Dim sURL As String
Observe los argumentos para la creación del documento, el acceso a los objetos de la colec-
ción y el uso de los métodos para insertar y mover una hoja de cálculo.
El servicio SpreadsheetView suministra funcionalidades relacionadas con la vista actual de
un documento de Calc. Incluye el servicio SpreadsheetViewSettings, que especifica algunas
propiedades de cada una de las hojas del documento y, su interfaz XspreadsheetView, aporta
los métodos a seguir para la definición de la hoja activa en el documento:
getActiveSheet ( ) As Object < XSpreadsheet >
setActiveSheet ( oHoja As Object < XSpreadsheet >)
Recuerde que las operaciones relacionadas con la interfaz gráfica son administradas por el ob-
jeto controlador del documento.
Introduzca el código fuente siguiente al final de Sub creaDocCalc, ejecute y observe el resul-
tado
7.3 Editando
Para editar el contenido de una o más celdas, debemos tener en mente lo siguiente:
a) obtener la hoja donde se encuentran las celdas a editar;
b) obtener un rango conteniendo las celdas a editar, este paso es opcional, pues una hoja es un
rango de celdas;
c) obtener la celda a editar;
d) especificar el contenido de la celda.
El ítem a) se debe solucionar con el uso del método getSheets (), asociado al acceso nominal,
indexado o enumerado, como se ha visto en la sección anterior.
Las herramientas para solucionar los ítems b), c) y d) también se presentaron en la sección
6.10 Tablas e involucra los métodos de las interfaces XCellRange e XCell.
Métodos de la interfaz com.sun.star.table.XCellRange:
getCellByPosition ( nColumna As Long, nFila As Long ) As Object < XCell >
getCellRangeByPosition ( nIzq, nSup, nDer, nInf ) As Object < XCellRange >
getCellRangeByName ( sRango As String ) As Object < XCellRange >
Debemos recordar que la posición de una celda, dentro de un rango, es relativa al inicio del
rango.
Métodos de la interfaz com.sun.star.table.XCell:
getFormula ( ) As String
setFormula ( sFormula As String )
getValue ( ) As Double
setValue ( nValor As Double )
getType ( ) As Long < com.sun.star.table.CellContentType >
getError ( ) As Long
Para recordarlo, veamos un ejemplo de edición del contenido de las celdas de una hoja. Intro-
duzca el código inferior, ejecútelo y observe el resultado.
Sub editaHoja
Observe que, en la segunda llamada del método setFormula(), definimos la fórmula usando el
nombre de una función en inglés. Para utilizar los nombres de las funciones mostrados por la
Los siguientes métodos, de la interfaz XUsedAreaCursor, son útiles cuando deseamos operar
sobre el área utilizada de una hoja de cálculo. Por ejemplo, identificar la última celda con los
datos de una hoja.
gotoStartOfUsedArea ( bExpande As Boolean )
gotoEndOfUsedArea ( bExpande As Boolean )
La interfaz XCellCursor, del servicio CellCursor, provee los siguientes métodos, ya explica-
dos en la sección 6.10 Tablas del capítulo 6. Documentos de Writer.
gotoStart ( )
gotoEnd ( )
gotoNext ( )
gotoPrevious ( )
gotoOffSet ( nDesplazColumna As Long, nDesplazFila As Long )
Para demostrar el uso de un cursor, introduzca el siguiente código y ejecútelo para observar el
resultado.
Sub creaCursorCeldas
Dim oDesk As Variant
Dim oDoc As Object
Dim mProp() As Variant
Dim sURL As String
'
' crea documento de Calc
oDesk = createUnoService("com.sun.star.frame.Desktop")
sUrl = "private:factory/scalc"
oDoc = oDesk.LoadComponentFromURL(sUrl, "_blank", 0, mProp())
'
' trabaja con un cursor
Dim oHojas As Object
Dim oCursor As Object
oHojas = oDoc.getSheets().getByIndex(0)
oCursor = oHojas.createCursorByRange(oHojas.getCellByPosition(0,0))
' soporta XSpreadSheet
MsgBox oCursor.getSpreadsheet().getName()
' edita algunas celdas
' observe que la posición de la celda es relativa
oCursor.getCellByPosition(0,0).setFormula("Celda A1")
oCursor.gotoNext()
oCursor.getCellByPosition(0,0).setFormula("Celda B1")
oCursor.gotoNext()
oCursor.getCellByPosition(0,0).setFormula("Celda C1")
' mueve el cursor 5 celdas hacia abajo
oCursor.gotoOffSet(0,5)
oCursor.getCellByPosition(0,0).setFormula("Abajo de C1")
oCursor.CharHeight = 16
' obtiene toda el área en uso
oCursor.gotoStartOfUsedArea(False)
oCursor.gotoEndOfUsedArea(True)
La siguiente parte de código obtiene un rango de celdas contínuas y muestra los índices de ho-
ja, columna inicial y final, fila inicial y final.
' para un rango: com.sun.star.sheet.CellRange
oRango = oDoc.getCurrentSelection()
oEnd = oRango.getRangeAddress()
MsgBox Str$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow)
MsgBox Str$(oEnd.EndColumn)+Str$(oEnd.EndRow)
Podemos, además, seleccionar rangos de celdas no contínuas, en una misma hoja o en hojas
diferentes, el bloque de código siguiente resuelve esta situación. En un documento de Calc,
seleccione rangos no contiguos, llame a la macro y ejecútela para ver la salida.
Sub seleccionRangos
Dim oDoc As Object
Dim oRangos As Object
oDoc = ThisComponent
' oRangos soporta com.sun.star.sheet.SheetCellRanges
oRangos = oDoc.getCurrentSelection()
MsgBox oRangos.getCount()
oEnd = oRangos.getRangeAddresses()
For n=0 To UBound(oEnd)
MsgBox Str$(oEnd(n).Sheet)+Str$(oEnd(n).StartColumn)+Str$(oEnd(n).StartRow)
Next n
MsgBox oRangos.getRangeAddressesAsString()
End Sub
7.6 Formateando
La presentación final de un trabajo es muy importante y Calc ofrece una vasta gama de posi-
bilidades para auxiliarnos en el formateo de nuestros documentos.
Inicialmente, podemos aplicar al contenido de una celda las técnicas de formateo de párrafos y
caracteres. Los principales servicios, ya presentados en la sección 6.4 Formateando Texto del
capítulo anterior, son :
com.sun.star.style.ParagraphProperties
com.sun.star.style.CharacterProperties
Otras propiedades para el formateo de celdas están cubiertas por los servicios:
com.sun.star.table.CellProperties
com.sun.star.table.TableBorder
com.sun.star.table.BorderLine
El servicio CellProperties contiene diversas propiedades. Las más importantes se vieron en la
sección 6.10 Tablas del capítulo 6. Documentos de Writer.
Aplicaremos algún formato al ejemplo creado por Sub editaHoja. Añada el siguiente código
fuente al final de la subrutina, ejecute la macro y observe la salida:
' Formateo
Dim oRango As Object
Dim oFila As Object
Dim oColumna As Object
'
' formatea párrafos y caracteres
oRango = oHoja.getCellRangeByPosition(0, 0, 5, 0)
oRango.CharHeight = 12
oRango.CharWeight = com.sun.star.awt.FontWeight.BOLD
oRango.ParaAdjust = com.sun.star.style.ParagraphAdjust.CENTER
' ajusta la altura de la fila 1
oFila = oHoja.getRows().getByIndex(0)
oFila.OptimalHeight = True
' ajusta el ancho de la columna B
oColumna = oHoja.getColumns().getByIndex(1)
oColumna.OptimalWidth = True
Uniendo Celdas
Insertando Bordes
Otro aspecto importante en la presentación de una hoja de cálculo es la colocación de los bor-
des en torno a las celdas. El servicio CellProperties contiene las siguientes propiedades que
definen el tipo de borde de una celda o rango de celdas:
Propiedad Descripción
TableBorder Define el borde de una celda o rango de celdas
TopBorder Define el borde superior de cada celda del rango
BottomBorder Define el borde inferior de cada celda del rango
RightBorder Define el borde derecho de cada celda del rango
LeftBorder Define el borde izquierdo de cada celda del rango
nea. Para la propiedad TableBorder, podemos definir cuatro líneas: TopLine, BottomLine,
RightLine y LeftLine.
Siguiendo con nuestro ejemplo, uniremos algunas celdas, y después, definiremos los bordes
para nuestra hoja. Añada el siguiente código a la subrutina Sub editaHoja y observe el resul-
tado de la ejecución:
' une celdas
oRango = oHoja.getCellRangeByPosition(0, 7, 3, 7)
oRango.merge(True)
' Define Borde
Dim oBorde As New com.sun.star.table.TableBorder
Dim oLinBorde As New com.sun.star.table.BorderLine
'
oRango = oHoja.getCellRangeByPosition(0, 0, 4, 7)
' define el grosor y color de la línea de borde
oLinBorde.OuterLineWidth = 30
oLinBorde.Color = CLng( "&H000099" )
oRango.setPropertyValue("TopBorder", oLinBorde)
oRango.setPropertyValue("RightBorder", oLinBorde)
oRango.setPropertyValue("LeftBorder", oLinBorde)
oRango.setPropertyValue("BottomBorder", oLinBorde)
' defina y aplica la propiedad TableBorder
oLinBorde.OuterLineWidth = 100
oLinBorde.Color = CLng( "&HAABBCC" )
oBorde.TopLine = oLinBorde
oBorde.BottomLine = oLinBorde
oBorde.RightLine = oLinBorde
oBorde.LeftLine = oLinBorde
oBorde.IsTopLineValid = True
oBorde.IsBottomLineValid = True
oBorde.IsRightLineValid = True
oBorde.IsLeftLineValid = True
oRango.setPropertyValue("TableBorder", oBorde)
Inicialmente definimos los bordes de todas las celdas de oRango, después aplicamos un borde
al rango. Observe los campos Is...Valid definidos como True.
Formato Numérico
OpenOffice.org posee diversas categorías de formato numérico. Cada categoría posee diver-
sos formatos predefinidos. Mediante la interfaz XNumberFormatsSupplier podemos leer, mo-
dificar e añadir nuevos formatos a nuestros documentos.
La interfaz XNumberFormatsSupplier contiene los métodos siguientes:
getNumberFormats ( ) As Object < com.sun.star.util.XNumberFormats >
getNumberFormatsSettings ( ) As Object < com.sun.star.beans.XPropertySet >
oDoc = ThisComponent
oFormatos = oDoc.getNumberFormats()
oSettings = oDoc.getNumberFormatSettings()
oInfo = oSettings.getPropertySetInfo()
oProp = oInfo.getProperties()
MsgBox UBound(oProp)
For n = 0 To UBound(oProp)
MsgBox oProp(n).Name
Next n
mClaves = oFormatos.queryKeys(0, oLocal, FALSE)
MsgBox UBound(mClaves)
mProp = oFormatos.getByKey(11).getPropertyValues()
' obtiene los nombres de las propiedades
sMsg = ""
For n=0 To UBound(mProp)
sMsg = sMsg + mProp(n).Name + Chr$(13)
Next n
MsgBox sMsg
' muestra el valor de FormatString
MsgBox mProp(0).Value
End Sub
Ahora, regresemos a nuestra subrutina Sub editaHoja para aplicar formatos numéricos en al-
gunas celdas. Añada el siguiente código, ejecútelo y observe la salida:
' Formatos Numéricos
Dim oFormatos As Object
Dim aLocal() As New com.sun.star.lang.Locale
' obtiene los formatos numéricos del modelo
oFormatos = oDoc.getNumberFormats()
' obtiene el índice del formato predefinido para MONEDA
n% = oFormatos.getStandardFormat( _
com.sun.star.util.NumberFormat.CURRENCY, aLocal())
' obtiene un rango de celdas
oRango = oDoc.getSheets().getByIndex(0).getCellRangeByPosition(3,1,4,6)
' modifica el formato predefinido para MONEDA
oRango.NumberFormat = n%
' obtiene una celda y la formatea como MONEDA
oCelda = oHoja.getCellByPosition(4, 7)
oCelda.NumberFormat = n%
Formato Condicional
mCond(1).Value = "500"
mCond(2).Name = "StyleName"
mCond(2).Value = "Result"
' limpia las condiciones existentes
oEntradas.clear()
' añade una nueva condición
oEntradas.addNew(mCond())
' aplica el formato condicional
oRango.setPropertyValue("ConditionalFormat", oEntradas)
Veamos un ejemplo de búsqueda: cree un nuevo documento de Calc, rellene algunas celdas
con el texto “TOTAL” y “TOTAL GENERAL”, seguidamente cree la macro inferior y ejecu-
te.
Sub buscaTexto
Dim oDoc As Object
oDoc = ThisComponent
oHoja = oDoc.Sheets(0)
oDescBusca = oHoja.createSearchDescriptor()
oDescBusca.SearchWords = True
oDescBusca.setSearchString ("TOTAL")
oResultado = oHoja.findFirst( oDescBusca )
i = 0
Do Until IsNull(oResultado)
oResultado.CharColor = RGB(250,100,50)
oResultado = oHoja.findNext(oResultado, oDescBusca )
i = i + 1
Loop
MsgBox "Ocurrencias de "+oDescBusca.getSearchString() + " " + Str$(i)
End Sub
He aquí una búsqueda y reemplazo sencillas, en el mismo documento del ejemplo anterior:
Sub reemplazaTexto
Dim oDoc As Object
Dim oDescriptor As Object
Dim oHoja As Object
oDoc = ThisComponent
oHoja = oDoc.Sheets(0)
oDescriptor = oHoja.createReplaceDescriptor()
oDescriptor.setSearchString( "TOTAL GENERAL" )
oDescriptor.setReplaceString( "Total" )
n = oHoja.replaceAll(oDescriptor)
sMsg = oDescriptor.getSearchString()+" por "+oDescriptor.getReplaceString()
MsgBox sMsg + " = " + Str$(n)
End Sub
Observe que debemos ejecutar la búsqueda y reemplazo en un rango de celdas. En los ejem-
plos utilizamos toda la hoja de cálculo.
7.8 Ordenando4
Para la ordenación de un rango de celdas, debemos utilizar los mismos conceptos y servicios
ya presentados en la sección 6.10 Tablas, del capítulo 6. Documentos de Writer.
A continuación, detallamos los principales métodos y propiedades utilizados en esta tarea.
Métodos de la interfaz com.sun.star.util.XSortable:
createSortDescriptor ( ) As Variant <com.sun.star.beans.PropertyValue>
sort (xDescriptor As Variant <com.sun.star.beans.PropertyValue> )
4 N. del T. Para esta sección rige lo que ya comentamos hablando de la ordenación de tablas en Writer. Los métodos
descritos son válidos en las versiones 1.0.x de OpenOffice.org, pero no funcionan en la versión 1.1.RC. En
posteriores revisiones de la presente Introducción... dejaremos el tema suficientemente concretado.
Observe que comenzamos por la declaración de variables, creamos un rango de celdas con
una llamada al método getCellRangeByPosition (), definimos sus propiedades (el campo de
ordenación es una propiedad del descriptor) y, finalmente, invocamos el método sort () para
ejecutar su tarea.
La interfaz XSheetFilterDescriptor contiene los siguientes métodos para obtener y definir los
campos con los criterios del filtro:
getFilterFields ( ) aCampos () As Object < TableFilterField >
Los pasos necesarios para filtrar datos en una hoja de cálculo son:
a) obtener el rango de celdas a filtrar;
b) definir la estructura de los campos con los criterios de filtro;
c) crear y definir los datos del descriptor del filtro;
d) aplicar el filtro.
Veamos una sección de código que aplica un filtro sencillo en un rango de celdas.
Sub aplicaFiltro
Dim oDoc As Object
Dim oHoja As Object
Dim oRango As Object
Dim oDescFiltro As Variant
Dim oCamposFiltro(0) As New com.sun.star.sheet.TableFilterField
oDoc = ThisComponent
oHoja = oDoc.getSheets().getByIndex(0)
oRango = oHoja.getCellRangeByPosition(0,1,4,6)
' define la estructura TableFilterField
oCamposFiltro(0).Field = 4
oCamposFiltro(0).IsNumeric = True
oCamposFiltro(0).Operator = _
com.sun.star.sheet.FilterOperator.GREATER_EQUAL
oCamposFiltro(0).NumericValue = 300
' crea el descriptor de filtro vacío (True)
oDescFiltro = oRango.createFilterDescriptor (True)
' define el campo de filtro
oDescFiltro.setFilterFields (oCamposFiltro())
' aplica el filtro
oRango.filter (oDescFiltro)
'
MsgBox "OK para filtrar Caracteres"
' redefine la estructura TableFilterField
oCamposFiltro(0).Field = 0
oCamposFiltro(0).IsNumeric = False
oCamposFiltro(0).Operator = com.sun.star.sheet.FilterOperator.GREATER
oCamposFiltro(0).StringValue = "A 1"
' crea un descriptor de filtro vacío (True)
oDescFiltro = oRango.createFilterDescriptor (True)
' define o campo de filtro
oDescFiltro.setFilterFields (oCamposFiltro())
' aplica o filtro
oRango.filter (oDescFiltro)
End Sub
Si quiere usted probar este código, inserte esta macro en el documento generado por la
subrutina Sub editaHoja y ejecútela, observando la salida. Observe que la estructura
TableFilterField puede tener más de un campo con criterios de filtro.
Intente añadir código para copiar el resultado del filtro en la Hoja2 del documento.
Además de las propiedades anteriores, el descriptor debe contener los campos de subtotales.
La interfaz XSubTotalDescriptor proporciona métodos para añadir o eliminar campos:
addNew ( aColumnas() As < SubTotalColumn >, nColGrupo As Long)
añade los campos al descriptor, nColGrupo especifica la columna base para la agrupación
clear ( )
elimina todos los campos de subtotales del objeto
La estructura com.sun.star.sheet.SubTotalColumn contiene los elementos:
Los pasos necesarios para añadir filas con subtotales en un rango son:
a) obtener el rango de celdas a totalizar;
b) definir la estructura de los campos de subtotal;
c) crear y definir los datos del descriptor de subtotal;
d) aplicar la operación de subtotal.
Veamos un segmento de código que aplica un subtotal en un rango de celdas.
Sub aplicaSubTotal
Dim oDoc As Object
Dim oHoja As Object
Dim oRango As Object
Dim oDescSubTotal As Variant
Dim oCamposSubTotal(0) As New com.sun.star.sheet.SubTotalColumn
oDoc = ThisComponent
oHoja = oDoc.getSheets().getByIndex(0)
oRango = oHoja.getCellRangeByPosition(0,0,4,6)
' define a estructura SubTotalColumn
oCamposSubTotal(0).Column = 4
oCamposSubTotal(0).Function = com.sun.star.sheet.GeneralFunction.SUM
' crea un descriptor de subtotal
oDescSubTotal = oRango.createSubTotalDescriptor (True)
' añade el campo subtotal y la columna base
oDescSubTotal.addNew (oCamposSubTotal(), 0)
' aplica el subtotal
oRango.applySubTotals(oDescSubTotal, True)
End Sub
Para comprobar este código, cree una macro en el documento generado por Sub editaHoja,
ejecútelo y analice el resultado.
7.11 Gráficos
Un gráfico es un documento incrustado en otro documento de OpenOffice.org. La API de
OpenOffice.org contiene diversos servicios e interfaces para la generación de gráficos, a partir
de los datos contenidos en una hoja de cálculo.
El servicio com.sun.star.table.TableCharts soporta los métodos de las interfaces XTable-
Charts, XIndexAccess y XEnumerationAccess.
Métodos de la interfaz com.sun.star.table.XTableCharts:
addNewByName ( sNombre As String,
oArea As Object < com.sun.star.awt.Rectangle >,
oRango ( ) As Object < com.sun.star.table.CellRangeAddress >,
bTitCol As Boolean, bTitLin As Boolean )
Añade el gráfico a la colección de gráficos de la hoja. Sus argumentos son:
Un documento gráfico contiene una referencia para un origen de datos, un diagrama y algunas
propiedades como título, subtítulo y leyenda. El servicio ChartDocument es el modelo de
documento gráfico y soporta las interfaces XChartDocument, XPropertySet y XMultiServi-
ceFactory. El mismo posee las siguientes propiedades:
HasMainTitle - Si True (Verdadero), muestra el título principal
HasSubTitle - Si True (Verdadero), muestra el subtítulo
HasLegend - Si True (Verdadero), muestra la leyenda
El diagrama es el objeto que contiene la forma del gráfico, basada en el servicio Diagram y
sus interfaces XDiagram y XPropertySet. Diferentes tipos de diagramas pueden ser creados
con el método createInstance (), de la interfaz XMultiServiceFactory. He aquí algunos ser-
vicios para tipos de diagramas:
com.sun.star.chart.BarDiagram
com.sun.star.chart.LineDiagram
com.sun.star.chart.PieDiagram
com.sun.star.chart.AreaDiagram
com.sun.star.chart.XYDiagram
Next i%
'
' inserta un gráfico de columnas
Dim oRect As New com.sun.star.awt.Rectangle
Dim oFinRango(0) As New com.sun.star.table.CellRangeAddress
Dim oGraficos As Object
' define el nombre del gráfico
sNombre = "Trimestral"
' define la dirección del rango de celdas con los datos
oFinRango(0).Sheet = 0
oFinRango(0).StartColumn = 0
oFinRango(0).StartRow = 0
oFinRango(0).EndColumn = 3
oFinRango(0).EndRow = 4
' define el área del gráfico
oRect.X = 1000
oRect.Y = 3000
oRect.Width = 12000
oRect.Height = 12000
' obtiene la colección de gráficos de la Hoja1
oGraficos = oHoja.Charts
' añade un gráfico a la colección
oGraficos.addNewByName(sNombre, oRect, oFinRango(), True, True)
' define las propiedades(Titulo)
oGraf = oGraficos.getByName(sNombre).getEmbeddedObject()
oGraf.Title.String = "Facturación Trimestral"
oGraf.HasSubTitle = True
oGraf.SubTitle.String = "Año 2003"
End Sub
Comenzamos rellenando las celdas con los datos, después definimos el nombre del gráfico, el
rango de las celdas con los datos y el área donde se dibujará el gráfico. Tras estos pasos preli-
minares, obtenemos la colección de gráficos de la hoja y añadimos nuestro gráfico a la colec-
ción, con una llamada al método addNewByName ( ). Finalmente, obtenemos el objeto grá-
fico incrustado, con una llamada el método getByName ( ) asociada al método getEmbedde-
dObject ( ) y, entonces, modificamos algunas propiedades del gráfico.
Aprovechando el ejemplo anterior, mostraremos como modificar la propiedad Diagram de un
gráfico. Añada el siguiente código al final de Sub creaGrafico y ejecútelo para crear un grá-
fico de pastel (circular), representando los datos de la fila 2 de la hoja de cálculo.
' Creando un gráfico do tipo circular
Dim oRangoCirc(1) As New com.sun.star.table.CellRangeAddress
'
MsgBox "Aceptar para un gráfico Circular"
' elimina el gráfico de barras
oGraficos.removeByName(sNombre)
sNombre = "GrafCirc"
' define la dirección del rango de las celdas con leyendas
oRangoCirc(0).Sheet = 0
oRangoCirc(0).StartColumn = 0
oRangoCirc(0).StartRow = 0
oRangoCirc(0).EndColumn = 3
oRangoCirc(0).EndRow = 0
' define la dirección del rango con datos
oRangoCirc(1).Sheet = 0
oRangoCirc(1).StartColumn = 0
oRangoCirc(1).StartRow = 1
oRangoCirc(1).EndColumn = 3
oRangoCirc(1).EndRow = 1
' añade un gráfico a la colección
oGraficos.addNewByName(sNombre, oRect, oRangoCirc(), True, True)
' define las propiedades
oGraf = oGraficos.getByName(sNombre).getEmbeddedObject()
oGraf.Diagram = oGraf.createInstance("com.sun.star.chart.PieDiagram")
oGraf.Diagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.ROWS
oGraf.Title.String = "1º Trimestre – 2003"
8 Más información
8.1 En la red
OpenOffice.org :
http://www.openoffice.org
http://www.openoffice.org.br (en portugués - Brasil)
http://es.openoffice.org (en español)
OOoDocs.Org http://www.ooodocs.org
Documentación y notícias sobre o OpenOffice.org.
OOoMacros http://ooomacros.sourceforge.net
Repositorio de modelos, macros y asistentes para OpenOffice.org. Descargue todas las macros
y estudie su código para aprender más.
OOExtras http://ooextras.sourceforge.net
Abundantes modelos, plantillas, macros e imágenes para añadir a la galería. Vale la pena
curiosear por aquí.
Pitonyak.org www.pitonyak.org/
Andrew Pitonyak y sus colaboradores merecen nuestra gratitud. Esta página contiene un
excelente documento sobre macros y lenguaje Basic. Consúltela periódicamente.
9.1 Créditos
Autor del diseño gráfico del modelo: Mirto Silvio Busico <m.busico@ieee.org>
Autor del texto explicativo del modelo: Gianluca Turconi <luctur@openoffice.org>
La traducción al español y adaptación de pantallazos a OOo 1.1 ha sido perpetrada por Ismael
Fanlo <ifanlo@tiscali.es>
9.2 Agradecimientos
A Sun Microsystems, Inc por el apoyo para la creación y desarrollo de OpenOffice.org.
A Sun Microsystems, Inc, una vez más, por hacer disponible la documentación sobre la API
de OpenOffice.org, sin la cual este trabajo no sería posible.
A todos los voluntarios que, con su trabajo, contribuyen al crecimiento de OpenOffice.org.
9.3 Licencia
Se permite la copia, distribución y / o modificación de este documento, bajo los términos de la
GNU Free Documentation License, Versión 1.1 o una versión posterior publicada por la Free
Software Foundation. Una copia de la licencia a compaña a este documento, consulte el ar-
chivo FDL.TXT. Si usted no recibió una copia de este archivo, por favor informe al autor o al
webmaster del sitio donde obtuvo este documento.
Copyright © 2003 Noelson Alves Duarte.