Contenuto

# Formattare i bordi in Calc usando le macro

Usando il linguaggi di programmazione Basic o Python è possibile scrivere macro che applicano formattazioni a intervalli di celle di Calc.

## Formattare i bordi degli intervalli di celle

Il frammento di codice sottostante crea una Sub chiamata FormatCellBorder che applica dei nuovi formati a un determinato intervallo di indirizzi all'interno del foglio corrente di Calc.

        Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
            ' Crea la struttura UNO che conterrà il nuovo formato delle linee
            Dim lineFormat as New com.sun.star.table.BorderLine2
            lineFormat.LineStyle = newStyle
            lineFormat.LineWidth = newWidth
            If Not IsMissing(newColor) Then lineFormat.Color = newColor
            ' Ottiene la cella di destinazione
            Dim oCell as Object
            Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
            ' Applica il nuovo formato a tutti i bordi
            oCell.TopBorder = lineFormat
            oCell.RightBorder = lineFormat
            oCell.LeftBorder = lineFormat
            oCell.BottomBorder = lineFormat
        End Sub

La Sub appena descritta richiede quattro argomenti:

- cellAddress è la stringa che indica l'intervallo di celle da formattare, indicato nel formato "A1".

- newStyle è un numero intero che corrisponde allo stile del bordo (vedere il successivo paragrafo Stili delle linee).

- newWidth è un numero intero che definisce lo spessore della linea.

- newColor è un numero intero che corrisponde a un colore definito usando la funzione RGB.

Per richiamare FormatCellBorder creare una nuova macro e passare gli argomenti desiderati, come illustrato di seguito:

        Sub MyMacro
            ' Fornisce l'accesso alle costanti di stile della linea
            Dim cStyle as Object
            Set cStyle = com.sun.star.table.BorderLineStyle
            ' Formatta "B5" con bordi blu pieni
            FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
            ' Formatta tutti i bordi dell'intervallo "D2:F6" con bordi rossi a puntini
            FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
        End Sub

È possibile implementare la stessa funzionalità in Python:

        from uno import createUnoStruct
        from scriptforge import CreateScriptService

        def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
            # Definisce il nuovo formato della linea
            line_format = createUnoStruct("com.sun.star.table.BorderLine2")
            line_format.LineStyle = newStyle
            line_format.LineWidth = newWidth
            line_format.Color = newColor
            # il servizio Scriptforge per accedere agli intervalli di celle
            doc = CreateScriptService("Calc")
            cell = doc.XCellRange(cellAddress)
            cell.TopBorder = line_format
            cell.RightBorder = line_format
            cell.LeftBorder = line_format
            cell.BottomBorder = line_format

Il frammento di codice seguente implementa una macro denominata myMacro che richiama 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))

Il codice in Python presentato sopra usa la libreria ScriptForge che è disponibile dalla versione 7.2 di LibreOffice.

## Stili delle linee

Gli stili delle linee sono definiti in forma di costanti rappresentate da numeri interi. La seguente tabella elenca le costanti degli stili di linea disponibili in Formato - Celle - Bordi:

Nome della costante | Valore intero | Nome dello stile di linea
--- | --- | ---
SOLID | 0 | Tinta unita
DOTTED | 1 | Punteggiata
DASHED | 2 | Tratteggiata
FINE_DASHED | 14 | A tratti fini
DOUBLE_THIN | 15 | Doppia sottile
DASH_DOT | 16 | Tratto punto
DASH_DOT_DOT | 17 | Tratto punto punto

Per saperne di più sulle costanti degli stili di linea, consultare la pagina BorderLineStyle Constant Reference nella documentazione delle API di LibreOffice API.

## Formattare i bordi usando TableBorder2

Gli oggetti Range possiedono una proprietà denominata TableBorder2 che si può usare per formattare i bordi degli intervalli di celle come avviene nella finestra di dialogo Formato - Celle - Bordi, area Cornice.

Oltre ai margini superiore, inferiore, sinistro e destro, TableBorder2 definisce anche i bordi verticali e orizzontali. La macro sottostante applica solamente i margini superiore e inferiore all'intervallo di celle "B2:E5".

        Sub TableBorder2Example
            Dim cStyle as Object
            Set cStyle = com.sun.star.table.BorderLineStyle
            ' Definisce il nuovo formato della linea
            Dim lineFormat as New com.sun.star.table.BorderLine2
            lineFormat.LineStyle = cStyle.SOLID
            lineFormat.LineWidth = 15
            lineFormat.Color = RGB(0, 0, 0)
            ' Struttura che memorizza la nuova definizione di TableBorder2
            Dim tableFormat as New com.sun.star.table.TableBorder2
            tableFormat.TopLine = lineFormat
            tableFormat.BottomLine = lineFormat
            tableFormat.IsTopLineValid = True
            tableFormat.IsBottomLineValid = True
            ' Applica il formato della tabella all'intervallo "B2:E5"
            Dim oCell as Object
            oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
            oCell.TableBorder2 = tableFormat
        End Sub

È possibile implementare la macro in Python come segue:

        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

Per saperne di più sui sui attributi, consultare la pagina TableBorder2 Struct Reference nella documentazione della API di LibreOffice API.

Argomenti correlati

La libreria ScriptForge