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:

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))
  
note

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


tip

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
  
tip

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


¡Necesitamos su ayuda!