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 Collabora Office 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!