Estilos y autoformato

From Apache OpenOffice Wiki
< ES‎ | Manuales‎ | GuiaAOO‎ | TemasAvanzados‎ | Macros‎ | StarBasic‎ | TrabajandoConCalc‎ | DandoFormato
Revision as of 17:01, 18 March 2013 by Salva (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


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

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


ES StarBasic Calc EstilosAutoformato.17.png


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.


ES StarBasic Calc EstilosAutoformato.02.png


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.


ES StarBasic Calc EstilosAutoformato.16.png


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.



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

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

Personal tools