Sumário

# 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:

- cellAddress é uma string que denota o intervalo a ser formatado usando a notação "A1".

- newStyle é um valor inteiro que corresponde ao estilo de linha da borda (veja Estilos de Linha abaixo).

- newWidth é um valor inteiro que define a espessura da linha.

- newColor é um valor inteiro que corresponde à cor definida usando a função RGB.

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

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

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

Consulte a página TableBorder2 Struct Reference na documentação da API do LibreOffice para saber mais sobre seus atributos.

Tópicos relacionados

A Biblioteca ScriptForge