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 LibreOffice 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! ♥