Contido

# Formatar bordos no Calc con macros

Ao empregar as linguaxes de programación BASIC ou Python é posíbel escribir macros que apliquen formatos a intervalos de celas do Calc.

## Formatar borods en intervalos de celas

O fragmento de código de abaixo crea unha sub chamada FormatCellBorder que aplica novos formatos de bordo a un intervalo dado da folla de Calc activa.

        Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
            ' Crea o struct de UNO que almacena o novo formato de liña
            Dim lineFormat as New com.sun.star.table.BorderLine2
            lineFormat.LineStyle = newStyle
            lineFormat.LineWidth = newWidth
            If Not IsMissing(newColor) Then lineFormat.Color = newColor
            ' Obtén a cela de destino
            Dim oCell as Object
            Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
            ' aplica o novo formato a todos os bordos
            oCell.TopBorder = lineFormat
            oCell.RightBorder = lineFormat
            oCell.LeftBorder = lineFormat
            oCell.BottomBorder = lineFormat
        End Sub

A Sub descrita arriba toma catro argumentos:

- cellAddress é unha cadea que denota o intervalo que hai que formatar no formato «A1».

- newStyle é un valor enteiro que corresponde co estilo de liña do bordo (vexa Estilos de liña máis abaixo).

- newWidth é un valor enteiro que define o grosor da liña.

- newColor é un valor enteiro que corresponde á cor definida empregando a función RGB.

Para invocar FormatCellBorder, cree unha macro nova e pase os argumentos desexados, como se mostra aquí abaixo:

        Sub MyMacro
            ' Fornece acceso ás constantes do estilo de liña
            Dim cStyle as Object
            Set cStyle = com.sun.star.table.BorderLineStyle
            ' Formata «B5» con bordos azuis continuos
            FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
            ' Formata todos os bordos do intervalo «D2:F6» con bordos de puntos vermellos
            FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
        End Sub

É posíbel implementar a mesma funcionalidade en Python:

        from uno import createUnoStruct
        from scriptforge import CreateScriptService

        def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
            # Define o novo formato de liña
            line_format = createUnoStruct("com.sun.star.table.BorderLine2")
            line_format.LineStyle = newStyle
            line_format.LineWidth = newWidth
            line_format.Color = newColor
            # servizo de Scriptforge para acceder a intervalos de celas
            doc = CreateScriptService("Calc")
            cell = doc.XCellRange(cellAddress)
            cell.TopBorder = line_format
            cell.RightBorder = line_format
            cell.LeftBorder = line_format
            cell.BottomBorder = line_format

O fragmento de código de abaixo implementa unha macro chamada myMacro que invoca 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 en Python presentado arriba emprega a biblioteca ScriptForme, que está dispoñíbel desde a versión 7.2 do LibreOfficeDev.

## Estilos de liña

Os estilos de liña defínense como constantes enteiras. A táboa de abaixo lista as constantes para os estilos de liña dispoñíbeis en Formato - Celas - Bordos:

Nome da constante | Valor enteiro | Nome do estilo de liña
--- | --- | ---
SOLID | 0 | Continua
DOTTED | 1 | Punteado
DASHED | 2 | Descontinuo
FINE_DASHED | 14 | Fina, descontinua
DOUBLE_THIN | 15 | Dobre delgada
DASH_DOT | 16 | Trazo-punto
DASH_DOT_DOT | 17 | Trazo punto punto

Consulte a Referencia da constante BorderLineStyle na documentación da API de LibreOffice para máis detalles das constantes de estilos de liña.

## Dar formato a bordos mediante TableBorder2

Os obxectos do intervalo posúen unha propiedade denominada TableBorder2 que pode utilizarse para dar formato aos bordos do intervalo tal como se fai no cadro de diálogo Formato - Celas - Bordos na sección Disposición das liñas.

Ademais dos bordos superior, inferior, esquerdo e dereito, TableBorder2 tamén define os bordos vertical e horizontal. A seguinte macro afecta só aos bordos superior e inferior do intervalo «B2:E5».

        Sub TableBorder2Example
            Dim cStyle as Object
            Set cStyle = com.sun.star.table.BorderLineStyle
            ' Define o novo formato de liña
            Dim lineFormat as New com.sun.star.table.BorderLine2
            lineFormat.LineStyle = cStyle.SOLID
            lineFormat.LineWidth = 15
            lineFormat.Color = RGB(0, 0, 0)
            ' Estrutura que almacena a nova definición 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 táboa ao intervalo «B2:E5»
            Dim oCell as Object
            oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
            oCell.TableBorder2 = tableFormat
        End Sub

A macro pódese implementar en Python da seguinte maneira:

        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 Referencia á estructura TableBorder2 na documentación da API de LibreOffice para máis información sobre os seus atributos.

Temas relacionados

A biblioteca ScriptForge

Precisamos da súa axuda!