Formatar bordas no Calc com macros

Ao usar as linguagens Basic ou Python é possível escrever macros que aplicam formatos a intervalos de células no Calc.

Formatar bordas em intervalos de células

O trecho de código abaixo cria uma Sub chamada FormatCellBorder que aplica novos formatos de borda para um dado endereço de células na planilha Calc atual.

Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
    ' Cria um struct UNO que armazenará o novo formato de linha
    Dim lineFormat as New com.sun.star.table.BorderLine2
    lineFormat.LineStyle = newStyle
    lineFormat.LineWidth = newWidth
    If Not IsMissing(newColor) Then lineFormat.Color = newColor
    ' Obtém a célula de destino
    Dim oCell as Object
    Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
    ' Aplica o novo formato a todas as bordas
    oCell.TopBorder = lineFormat
    oCell.RightBorder = lineFormat
    oCell.LeftBorder = lineFormat
    oCell.BottomBorder = lineFormat
End Sub

A Sub descrita acima tem quatro argumentos de entrada:

Para chamar FormatCellBorder crie uma nova macro e passe os argumentos desejados, conforme mostra o exemplo abaixo:

Sub MyMacro
    ' Fornece acesso às constantes de estilo de linha
    Dim cStyle as Object
    Set cStyle = com.sun.star.table.BorderLineStyle
    ' Formata "B5" com uma borda sólida azul
    FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
    ' Formata todas as bordas no intervalo "D2:F6" com borda vermelha pontilhada
    FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
End Sub

É possível implementar a mesma funcionalidade em Python:

from uno import createUnoStruct
from scriptforge import CreateScriptService

def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
    # Define o novo formato de linha
    line_format = createUnoStruct("com.sun.star.table.BorderLine2")
    line_format.LineStyle = newStyle
    line_format.LineWidth = newWidth
    line_format.Color = newColor
    # Serviço ScriptForge para acessar intervalos de célula
    doc = CreateScriptService("Calc")
    cell = doc.XCellRange(cellAddress)
    cell.TopBorder = line_format
    cell.RightBorder = line_format
    cell.LeftBorder = line_format
    cell.BottomBorder = line_format

O trecho de código abaixo implementa a macro chamada myMacro que chama 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

O código Python apresentado acima usa a biblioteca ScriptForge que está disponível a partir do Collabora Office 7.2.


Estilos de linha

Estilos de linhas são definidos como valores inteiros constantes. A tabela abaixo lista as constantes para os estilos de linha disponíveis no menu Formatar - Células - Bordas:

Nome da constante

Valor inteiro

Nome do estilo de linha

SOLID

0

Sólido

DOTTED

1

Pontilhado

DASHED

2

Tracejado

FINE_DASHED

14

Tracejado fino

DOUBLE_THIN

15

Duplo, fino

DASH_DOT

16

Traço ponto

DASH_DOT_DOT

17

Traço ponto ponto


tip

Consulte a página BorderLineStyle Constant Reference na documentação da API do LibreOffice para saber mais sobre as constantes de estilo de linha.


Formatando bordas usando TableBorder2

Objetos de intervalos possuem uma propriedade chamada TableBorder2 que pode ser usada para formatar bordas de células da mesma forma como é feito usando a caixa de diálogo Formatar - Células - Bordas na seção Disposição de linhas.

Além das bordas superior, inferior, esquerda e direita, TableBorder2 também define bordas horizontais e verticais. A macro abaixo aplica apenas bordas superior e inferior ao intervalo "B2:E5".

Sub TableBorder2Example
    Dim cStyle as Object
    Set cStyle = com.sun.star.table.BorderLineStyle
    ' Define o novo formato de linha
    Dim lineFormat as New com.sun.star.table.BorderLine2
    lineFormat.LineStyle = cStyle.SOLID
    lineFormat.LineWidth = 15
    lineFormat.Color = RGB(0, 0, 0)
    ' Struct que armazena a nova definição de TableBorder2
    Dim tableFormat as New com.sun.star.table.TableBorder2
    tableFormat.TopLine = lineFormat
    tableFormat.BottomLine = lineFormat
    tableFormat.IsTopLineValid = True
    tableFormat.IsBottomLineValid = True
    ' Aplica o formato de tabela ao intervalo "B2:E5"
    Dim oCell as Object
    oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
    oCell.TableBorder2 = tableFormat
End Sub

A macro pode ser implementada em Python conforme mostrado a seguir:

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 a página TableBorder2 Struct Reference na documentação da API do LibreOffice para saber mais sobre seus atributos.


♥ Doe para nosso projeto! ♥