Estilos y autoformato
Como buen usuario de OpenOffice.org que somos, sabemos que una de sus características más ricas esta en sus “estilos”, es decir, en la posibilidad de agrupar bajo un nombre, una serie de características de formato y que podemos aplicar con un solo clic. Dentro de las hojas de cálculo, tenemos dos estilos perfectamente definidos, los estilos de celda que veremos en este capitulo y los estilos de página que se verán en el siguiente. Para ver los estilos de celda actuales usamos la siguiente macro.
Sub Estilos1() Dim oDoc As Object Dim oEstilos As Object Dim oEstilosCelda As Object Dim oSel As Object 'Accedemos al documento actual oDoc = ThisComponent 'Accedemos a todos los estilos oEstilos = oDoc.getStyleFamilies() 'Accedemos a los estilos de celda oEstilosCelda = oEstilos.getByName("CellStyles") 'Mostramos sus nombres MsgBox Join( oEstilosCelda.getElementNames(), Chr(13) ) End Sub
Si no tienes ningún estilo de celda personalizado, crea uno con el formato que quieras (tecla F11), vuelve a correr la macro y tienes que ver listado el nuevo estilo.
En nuestro ejemplo, hemos agregado un nuevo estilo de celda que se llama “Domingos”, los estilos de celda los podemos establecer a una celda, un rango de celdas, un grupo de rangos de una forma sumamente sencilla, veamos como.
Sub Estilos2() Dim oSel As Object oSel = ThisComponent.getCurrentSelection() 'Aplicamos el estilo de celda Domingos a la selección actual oSel.CellStyle = "Domingos" End Sub
Veamos la diferencia entre aplicar formato directo a las celdas y usar un estilo, en la siguiente macro, formateamos la selección con las características indicada en cada línea.
Sub Estilos3() Dim oSel As Object oSel = ThisComponent.getCurrentSelection() With oSel 'Tipo de letra .CharFontName = "Nimbus Sans L" 'Tamaño de letra .CharHeight = 15 'Negritas .CharWeight = 150 'Cursiva o italica .CharPosture = 2 'Alineamos en medio verticalmente .VertJustify = 2 'Alineamos centrado horizontalmente .HoriJustify = 2 'Color de fondo de la celda .CellBackColor = RGB(204,204,204) 'Color de la fuente .CharColor = RGB(0,0,255) End With End Sub
Ahora, crea un estilo con estas mismas características, para nuestro ejemplo le llamaremos “Resaltado1” y procedamos a aplicar a la selección.
Sub Estilos4() Dim oSel As Object oSel = ThisComponent.getCurrentSelection() oSel.CellStyle = "Resaltado1" End Sub
No puede ser más fácil, pero (siempre hay un pero), si el estilo de celda no existe, el código no te dará ningún error, simplemente no hará nada, el nombre del estilo, debe estar escrito tal cual se dio de alta incluyendo mayúsculas y minúsculas, también, como sucede en la interfaz del usuario, cuando se borra un estilo de celda personalizado, que son los únicos que puedes eliminar, las celdas que tengan este estilo, pasarán a tener el estilo de celda predeterminado, por ello, es recomendable, verificar que el estilo exista y en caso de que no exista, crearlo, al crearlo, es recomendable verificar que no exista ya el nombre propuesto, pues si intentas agregar un nombre ya existente, te dará un error en tiempo de ejecución. Veamos un ejemplo.
Sub Estilos5() Dim oDoc As Object Dim oSel As Object Dim oEstilos As Object Dim oEstilosCelda As Object Dim oEstiloNuevo As Object 'Accedemos al documento actual oDoc = ThisComponent 'Accedemos a la selección oSel = ThisComponent.getCurrentSelection() 'Accedemos a todos los estilos oEstilos = oDoc.getStyleFamilies() 'Accedemos a los estilos de celda oEstilosCelda = oEstilos.getByName("CellStyles") 'Verificamos que el estilo exista If oEstilosCelda.hasByName( "Resaltado1" ) Then oSel.CellStyle = "Resaltado1" Else 'Si no existe lo creamos oEstiloNuevo = oDoc.createInstance( "com.sun.star.style.CellStyle" ) 'Lo agregamos a la colección de estilos oEstilosCelda.insertByName( "Resaltado1", oEstiloNuevo ) 'Establecemos su formato With oEstiloNuevo .CharFontName = "Nimbus Sans L" .CharHeight = 15 .CharWeight = 150 .CharPosture = 2 .VertJustify = 2 .HoriJustify = 2 .CellBackColor = RGB(204,204,204) .CharColor = RGB(0,0,255) End With 'Y lo aplicamos oSel.CellStyle = "Resaltado1" End If End Sub
Para borrar un estilo, usamos el método removeByName de la siguiente manera, recordando que al borrar el estilo, “todas”, las celdas que tengan dicho estilo, regresaran al estilo predeterminado, perdiéndose todo el formato.
Sub Estilos6() Dim oDoc As Object Dim oEstilos As Object Dim oEstilosCelda As Object Dim oEstiloNuevo As Object 'Accedemos al documento actual oDoc = ThisComponent 'Accedemos a todos los estilos oEstilos = oDoc.getStyleFamilies() 'Accedemos a los estilos de celda oEstilosCelda = oEstilos.getByName("CellStyles") 'Verificamos que el estilo exista If oEstilosCelda.hasByName( "Domingos" ) Then If MsgBox("¿Estas seguro de borrar el estilo?",36,"Borra estilo") = 6 then 'Quitamos el estilo oEstilosCelda.removeByName( "Domingos" ) MsgBox "Estilo de celda borrado" Else MsgBox "NO se borro ningún estilo" End If Else MsgBox "El estilo no existe" End If End Sub
El manejo de autoformato, es muy similar al de estilos, la diferencia, es que el autoformato siempre se aplica a un rango de celdas, mínimo, de tres columnas por tres filas, este servicio esta disponible tanto en hojas de calculo como en tablas de Writer, para ver los autoformatos disponibles usamos.
Sub Autoformato1() Dim oAutoFormatos As Object oAutoFormatos = createUnoService("com.sun.star.sheet.TableAutoFormats") 'Mostramos sus nombres MsgBox Join( oAutoFormatos.getElementNames(), Chr(13) ) End Sub
Para aplicar un autoformato se usa el método autoFormat de la siguiente manera.
Sub Autoformato2() Dim oSel As Object oSel = ThisComponent.getCurrentSelection() oSel.autoFormat("Verde") End Sub
Toma en cuenta que el rango seleccionado, “debe” ser un objeto ScCellRangeObj, es decir, un rango de celdas, si bien, por código, podrás aplicarlo a una sola celda pero te formateará un mínimo de tres fila por tres columnas, si seleccionas varios rangos de celdas, te dará un error pues ese objeto no implementa el método autoFormat, lo mejor, como siempre, es validar que la selección es correcta, si usas esta técnica. El nombre del autoformato, como en los estilos, debe ser exactamente como se llamó al crearlo, pero a diferencia de los estilos, si escribes mal el nombre, te dará un error en tiempo de ejecución, por ello, es mejor validar que exista, antes de usarlo, como en el siguiente ejemplo.
Sub Autoformato3() Dim oAutoFormatos As Object Dim oSel As Object Dim sNombreAF As String sNombreAF = "VerdeRojo" oAutoFormatos = createUnoService("com.sun.star.sheet.TableAutoFormats") 'Verificamos que exista el autoformato If oAutoFormatos.hasByName( sNombreAF ) Then oSel = ThisComponent.getCurrentSelection() 'Nos aseguramos que la selección sea un rango de celdas If oSel.getImplementationName = "ScCellRangeObj" Then 'de mínimo tres filas por tres columnas If oSel.getColumns.getCount > 2 And oSel.getRows.getCount > 2 Then oSel.autoFormat( sNombreAF ) Else MsgBox "El rango debe ser de minimo, 3 columnas por 3 filas" End If Else MsgBox "No es un rango de celdas" End If Else MsgBox "El autoformato no existe" End If End Sub
Para eliminar un autoformato, usamos el método removeByName como en.
Sub Autoformato4() Dim oAutoFormatos As Object oAutoFormatos = createUnoService("com.sun.star.sheet.TableAutoFormats") 'Verificamos que exista If oAutoFormatos.hasByName( "VerdeRojo" ) Then If MsgBox("¿Estas seguro de borrar el autoformato?",36,"Borra autoformato") = 6 Then 'Quitamos el autoformato oAutoFormatos.removeByName( "VerdeRojo" ) MsgBox "Autoformato borrado" Else MsgBox "NO se borro nada" End If Else MsgBox "El autoformato no existe" End If End Sub
A diferencia de los estilos de celda, cuando borras un autoformato, las celdas establecidas con este permanecen con dicho formato, pero el autoformato borrado ya no estará disponible para usarse, por lo que tenemos que crearlo de nuevo. Para crear un autoformato, primero hay que saber (y entender) como esta estructurado, observa la siguiente tabla.
1a Columna | 1a Columna de datos | 2a Columna de datos | Última Columna | |
---|---|---|---|---|
Encabezado 1a Fila | 0 | 1 | 2 | 3 |
1a Fila de datos | 4 | 5 | 6 | 7 |
2a Fila de datos | 8 | 9 | 10 | 11 |
Pie de Tabla Ultima Fila | 12 | 13 | 14 | 15 |
Un autoformato, no es más que una colección de formatos de celdas individuales, cada cruce de columna y fila representa un estilo de celda, que, como podrás notar, tenemos 16 estilos diferentes que podemos establecer. Como ya lo mencionamos, el área mínima para usar un autoformato, es de 3 x 3 celdas, si tu rango tiene más área, el formato de las columnas de datos se ira duplicando y alternando, lo mismo pasará con las filas en el sentido vertical. Observa la siguiente imagen, en la parte superior, están nuestros datos sin formato (“pelones” dicen en mi pueblo), y en la parte inferior, como es que queremos que quede, como podrás notar, soy una nulidad para el diseño, así que no te pongas muy estricto.
Para crear el autoformato anterior, usamos la siguiente macro, te recuerdo que el formato de cada celda (campo) del autoformato, tiene las mismas características de formato de las celdas vistas anteriormente (aunque no es posible aplicar todos los formatos presentes normalmente en celdas), por lo que no comentaré esa parte, vamos a formatear 16 celdas, así que será una macro un poco más larga de las que hemos venido probando, pero muy sencilla por que se repite bastante el código, veamos.
Sub CrearAutoFormato() Dim oAutoFormatos As Object Dim oNuevoAF As Object Dim sNombreAF As String Dim oDoc As Object Dim oSel As Object Dim oBordeLinea As New com.sun.star.table.BorderLine Dim oBordeTabla As New com.sun.star.table.TableBorder oDoc = ThisComponent oSel = oDoc.getCurrentSelection() oNuevoAF = oDoc.createInstance("com.sun.star.sheet.TableAutoFormat") oAutoFormatos = createUnoService("com.sun.star.sheet.TableAutoFormats") sNombreAF = "MiFormatoNuevo" 'Verificamos que no exista If Not oAutoFormatos.hasByName( sNombreAF ) Then 'Lo agregamos a la colección de AutoFormatos oAutoFormatos.insertByName( sNombreAF, oNuevoAF ) 'Le damos formato a cada celda With oBordeLinea .Color = 255 .OuterLineWidth = 60 End With With oBordeTabla .TopLine = oBordeLinea .IsTopLineValid = True .BottomLine = oBordeLinea .IsBottomLineValid = True .LeftLine = oBordeLinea .IsLeftLineValid = True .RightLine = oBordeLinea .IsRightLineValid = True End With 'Celda 0 Call FormatearCampoAF( oNuevoAF.getByIndex(0), 16711680, 16777215, "Liberation Sans", 13, oBordeTabla, 150, 2, 2 ) 'Celda 1 Call FormatearCampoAF( oNuevoAF.getByIndex(1), 16711680, 16777215, "Liberation Sans", 13, oBordeTabla, 150, 2, 2 ) 'Celda 2 Call FormatearCampoAF( oNuevoAF.getByIndex(2), 16711680, 16777215, "Liberation Sans", 13, oBordeTabla, 150, 2, 2 ) 'Celda 3 Call FormatearCampoAF( oNuevoAF.getByIndex(3), 16711680, 16777215, "Liberation Sans", 13, oBordeTabla, 150, 2, 2 ) 'Celda 4 Call FormatearCampoAF( oNuevoAF.getByIndex(4), 13421772, 2621593, "Liberation Sans", 12, oBordeTabla, 150, 3, 2 ) 'Celda 5 Call FormatearCampoAF( oNuevoAF.getByIndex(5), 13421772, 0, "Liberation Sans", 10, oBordeTabla, 100, 0, 2 ) 'Celda 6 Call FormatearCampoAF( oNuevoAF.getByIndex(6), 13421772, 0, "Liberation Sans", 10, oBordeTabla, 100, 0, 2 ) 'Celda 7 Call FormatearCampoAF( oNuevoAF.getByIndex(7), 2621593, 16777215, "Liberation Sans", 12, oBordeTabla, 150, 0, 2 ) 'Celda 8 Call FormatearCampoAF( oNuevoAF.getByIndex(8), 13421772, 2621593, "Liberation Sans", 12, oBordeTabla, 150, 3, 2 ) 'Celda 9 Call FormatearCampoAF( oNuevoAF.getByIndex(9), 16764057, 0, "Liberation Sans", 10, oBordeTabla, 150, 0, 2 ) 'Celda 10 Call FormatearCampoAF( oNuevoAF.getByIndex(10), 16764057, 0, "Liberation Sans", 10, oBordeTabla, 150, 0, 2 ) 'Celda 11 Call FormatearCampoAF( oNuevoAF.getByIndex(11), 2621593, 16777215, "Liberation Sans", 12, oBordeTabla, 150, 0, 2 ) 'Celda 12 Call FormatearCampoAF( oNuevoAF.getByIndex(12), 2621593, 16777215, "Liberation Sans", 12, oBordeTabla, 150, 3, 2 ) 'Celda 13 Call FormatearCampoAF( oNuevoAF.getByIndex(13), 2621593, 16777215, "Liberation Sans", 12, oBordeTabla, 150, 0, 2 ) 'Celda 14 Call FormatearCampoAF( oNuevoAF.getByIndex(14), 2621593, 16777215, "Liberation Sans", 12, oBordeTabla, 150, 0, 2 ) 'Celda 15 Call FormatearCampoAF( oNuevoAF.getByIndex(15), 13421772, 0, "Liberation Sans", 10, oBordeTabla, 150, 0, 2 ) 'De forma predeterminada incluimos todos las opciones With oNuevoAF .IncludeNumberFormat = True .IncludeBackground = True .IncludeBorder = True .IncludeFont = True .IncludeJustify = True .IncludeNumberFormat = True .IncludeWidthAndHeight = True End With 'Solo lo aplicamos si la selección es un rango de celdas If oSel.getImplementationName = "ScCellRangeObj" Then oSel.autoFormat( sNombreAF ) End If Else 'Si existe el formato lo aplicanos If oSel.getImplementationName = "ScCellRangeObj" Then oSel.autoFormat( sNombreAF ) End If End If End Sub 'Puedes agregar todas las propiedades que consideres Sub FormatearCampoAF(Campo As Object, ColorFondo As Long, ColorFuente As Long, Fuente As String, TamFuente As Integer, Bordes As Object, Negritas As Integer, HJ As Byte, VJ As Byte) With Campo .CellBackColor = ColorFondo .CharColor = ColorFuente .CharFontName = Fuente .CharHeight = TamFuente .TableBorder = Bordes .CharWeight = Negritas .HoriJustify = HJ .VertJustify = VJ End With End Sub
La macro anterior tiene unas pequeñas diferencias con la imagen mostrada al inicio de ella, tu tarea es notar las diferencias, así mismo, tiene una pequeña deficiencia que también tienes que encontrar, no esta difícil, solo tienes que ser un poco observador. Observa que hacemos uso de una subrutina (macro) de apoyo para darle formato a cada campo del autoformato, solo estoy considerando las propiedades más representativas, por supuesto, puedes complementarla con todas las que necesites pues estos campos tienen más de cuarenta propiedades.
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 |