Contenido

# Dar formato a bordes en Calc con macros

Es posible utilizar los lenguajes de programación BASIC y Python para escribir macros que apliquen formatos a intervalos de celdas en Calc.

## Dar formato a bordes en intervalos de celdas

El siguiente fragmento de código crea una Sub llamada FormatCellBorder que aplica formatos a los bordes de un intervalo en la hoja de Calc en uso.

        Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
            ' Crea la estructura UNO que almacenará el formato de línea nuevo
            Dim lineFormat as New com.sun.star.table.BorderLine2
            lineFormat.LineStyle = newStyle
            lineFormat.LineWidth = newWidth
            If Not IsMissing(newColor) Then lineFormat.Color = newColor
            ' Obtiene la celda de destino
            Dim oCell as Object
            Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
            ' Aplica el formato nuevo a todos los bordes
            oCell.TopBorder = lineFormat
            oCell.RightBorder = lineFormat
            oCell.LeftBorder = lineFormat
            oCell.BottomBorder = lineFormat
        End Sub

La Sub descrita anteriormente utiliza cuatro argumentos:

- cellAddress es una cadena que indica el intervalo que se formateará en el formato «A1».

- newStyle es un valor entero que corresponde al estilo de la línea del borde (véase Estilos de línea más abajo).

- newWidth es un valor entero que define el grosor de la línea.

- newColor es un valor entero que corresponde a un color que se define con la función RGB.

Para llamar a FormatCellBorder, cree una macro nueva y pase los argumentos deseados como se muestra a continuación:

        Sub MyMacro
            ' Da acceso a las constantes de estilo de línea
            Dim cStyle as Object
            Set cStyle = com.sun.star.table.BorderLineStyle
            ' Da formato a «B5» de bordes azules sólidos
            FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
            ' Formatea todos los bordes en el intervalo «D2:F6» con líneas punteadas rojas
            FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
        End Sub

Es posible implementar la misma funcionalidad en Python:

        from uno import createUnoStruct
        from scriptforge import CreateScriptService

        def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
            # Define el formato de línea nuevo
            line_format = createUnoStruct("com.sun.star.table.BorderLine2")
            line_format.LineStyle = newStyle
            line_format.LineWidth = newWidth
            line_format.Color = newColor
            # Servicio de ScriptForge para acceder a los intervalos de celdas
            doc = CreateScriptService("Calc")
            cell = doc.XCellRange(cellAddress)
            cell.TopBorder = line_format
            cell.RightBorder = line_format
            cell.LeftBorder = line_format
            cell.BottomBorder = line_format

El fragmento de código siguiente implementa una macro llamada myMacro que llama a formatCellBorder:

        from com.sun.star.table import BorderLineStyle as cStyle

        def myMacro():
            bas = CreateScriptService("Basic")
            formatCellBorder("B5", cStyle.SOLID, 20, bas.RGB(0, 0, 255))
            formatCellBorder("D2:F6", cStyle.DOTTED, 20, bas.RGB(255, 0, 0))

El código Python presentado anteriormente utiliza la biblioteca ScriptForge que está disponible desde LibreOffice 7.2.

## Estilos de línea

Los estilos de línea se definen como constantes de enteros. La tabla siguiente enumera las constantes de los estilos de línea disponibles en Formato ▸ Celdas ▸ Bordes:

Nombre de constante | Valor de entero | Nombre de estilo de línea
--- | --- | ---
SOLID | 0 | Sólido
DOTTED | 1 | Punteado
DASHED | 2 | Discontinuo
FINE_DASHED | 14 | Fina, discontinua
DOUBLE_THIN | 15 | Doble, delgada
DASH_DOT | 16 | Trazo-punto
DASH_DOT_DOT | 17 | Trazo-punto-punto

Consulte Referencia de la constante BorderLineStyle en la documentación de la API de LibreOffice para más detalles de las constantes de estilos de línea.

## Formato de bordes mediante TableBorder2

Los objetos del intervalo poseen una propiedad denominada TableBorder2 que puede utilizarse para dar formato a los bordes del intervalo tal como se hace en el cuadro de diálogo Formato ▸ Celdas ▸ Bordes, sección Disposición de líneas.

Además de los bordes superior, inferior, izquierdo y derecho, TableBorder2 también define los bordes vertical y horizontal. La siguiente macro afecta solo a los bordes superior e inferior del intervalo «B2:E5».

        Sub TableBorder2Example
            Dim cStyle as Object
            Set cStyle = com.sun.star.table.BorderLineStyle
            ' Define el formato de línea nuevo
            Dim lineFormat as New com.sun.star.table.BorderLine2
            lineFormat.LineStyle = cStyle.SOLID
            lineFormat.LineWidth = 15
            lineFormat.Color = RGB(0, 0, 0)
            ' Estructura que almacena la definición de TableBorder2 nueva
            Dim tableFormat as New com.sun.star.table.TableBorder2
            tableFormat.TopLine = lineFormat
            tableFormat.BottomLine = lineFormat
            tableFormat.IsTopLineValid = True
            tableFormat.IsBottomLineValid = True
            ' Aplica el formato de tabla al intervalo «B2:E5»
            Dim oCell as Object
            oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
            oCell.TableBorder2 = tableFormat
        End Sub

La macro se puede implementar en Python de la manera siguiente:

        from com.sun.star.table import BorderLineStyle as cStyle
        from scriptforge import CreateScriptService

        def tableBorder2Example():
            bas = CreateScriptService("Basic")
            line_format = createUnoStruct("com.sun.star.table.BorderLine2")
            line_format.LineStyle = cStyle.SOLID
            line_format.LineWidth = 18
            line_format.Color = bas.RGB(0, 0, 0)
            table_format = createUnoStruct("com.sun.star.table.TableBorder2")
            table_format.TopLine = line_format
            table_format.BottomLine = line_format
            table_format.IsTopLineValid = True
            table_format.IsBottomLineValid = True
            doc = CreateScriptService("Calc")
            cell = doc.XCellRange("B2:E5")
            cell.TableBorder2 = table_format

Consulte la referencia a la estructura TableBorder2 en la documentación de la API de LibreOffice para más información.

Temas relacionados

La biblioteca ScriptForge