Conteúdo

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

- cellAddress é uma cadeia de caracteres que indica o intervalo a ser formatado no formato «A1».

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

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

- newColor é um valor inteiro que corresponde a uma cor definida através da função RGB.

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

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

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

Consulte a Referência da estrutura TableBorder2 na documentação da API do LibreOffice para saber mais sobre os seus atributos.

Tópicos relacionados

A biblioteca ScriptForge

Necessitamos da sua ajuda!