Formatar bordas no Calc com macros

Utilizando as linguagens de programação Basic ou Python, é possível criar macros que apliquem formatações 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 a um intervalo de células especificado na folha atual do Calc.


    Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
        ' Cria a estrutura UNO que irá armazenar o formato de nova 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
  

O Sub descrito acima aceita quatro argumentos:

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


    Sub MyMacro
        ' Dá acesso às constantes de estilo de linha
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Formatos "B5" com bordas azuis contínuas
        FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
        ' Formata todas as bordas no intervalo "D2:F6" com bordas pontilhadas a vermelho
        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 formato de nova 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 aceder a intervalos de células
        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 uma 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 utiliza a biblioteca ScriptForge, disponível desde a versão LibreOffice 7.2.


Estilos de linha

Os estilos de linha são definidos como constantes inteiras. A tabela abaixo apresenta as constantes para os estilos de linha disponíveis em Formato - 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 Referência às constantes de estilo de linha na documentação da API do LibreOffice para saber mais sobre as constantes de estilo de linha.


Formatar bordas com o TableBorder2

Os objetos de intervalo possuem uma propriedade denominada TableBorder2 que pode ser utilizada para formatar as bordas do intervalo, tal como se faz na caixa de diálogo Formatar - Células - Bordas, na secção Disposição das linhas.

Para além das margens superior, inferior, esquerda e direita, TableBorder2 também define margens verticais e horizontais. A macro abaixo aplica apenas as margens superior e inferior ao intervalo «B2:E5».


    Sub TableBorder2Example
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Define o formato de nova linha
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = cStyle.SOLID
        lineFormat.LineWidth = 15
        lineFormat.Color = RGB(0, 0, 0)
        ' Estrutura 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 da seguinte forma:


    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 Referência da estrutura TableBorder2 na documentação da API do LibreOffice para saber mais sobre os seus atributos.