Randen opmaken in Calc met macro's

Door Basic of Python programmeertalen te gebruiken is het mogelijk om macro's te schrijven die opmaak toepassen op celbereiken in Calc.

Randen opmaken in celbereiken

Het onderstaande codefragment creƫert een Sub genaamd FormatCellBorder die nieuwe randopmaak toepast op een bepaald bereikadres in het huidige Calc-blad.


    Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
        ' Creƫert de UNO-struct die de nieuwe lijnopmaak zal opslaan
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = newStyle
        lineFormat.LineWidth = newWidth
        If Not IsMissing(newColor) Then lineFormat.Color = newColor
        ' Haalt de doelcel op
        Dim oCell as Object
        Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
        ' Past de nieuwe indeling toe op alle randen
        oCell.TopBorder = lineFormat
        oCell.RightBorder = lineFormat
        oCell.LeftBorder = lineFormat
        oCell.BottomBorder = lineFormat
    End Sub
  

De hierboven beschreven Sub heeft vier argumenten:

Om FormatCellBorder aan te roepen, maakt u een nieuwe macro en geeft u de gewenste argumenten door, zoals hieronder weergegeven:


    Sub MyMacro
        ' Geeft toegang tot de lijnstijlconstanten
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Opmaak "B5" met effen blauwe randen
        FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
        ' Maakt alle randen in het bereik "D2:F6" op met rode gestippelde randen
        FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
    End Sub
  

Het is mogelijk om dezelfde functionaliteit in Python te implementeren:


    from uno import createUnoStruct
    from scriptforge import CreateScriptService
    
    def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
        # Definieert de nieuwe lijnopmaak
        line_format = createUnoStruct("com.sun.star.table.BorderLine2")
        line_format.LineStyle = newStyle
        line_format.LineWidth = newWidth
        line_format.Color = newColor
        # Scriptforge-service om toegang te krijgen tot celbereiken
        doc = CreateScriptService("Calc")
        cell = doc.XCellRange(cellAddress)
        cell.TopBorder = line_format
        cell.RightBorder = line_format
        cell.LeftBorder = line_format
        cell.BottomBorder = line_format
  

Het onderstaande codefragment implementeert een macro met de naam myMacro die formatCellBorder aanroept:


    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

De hierboven weergegeven Python-code gebruikt de ScriptForge-bibliotheek die beschikbaar is sinds LibreOffice 7.2.


Lijnstijlen

Lijnstijlen worden gedefinieerd als geheeltallige constanten. In de onderstaande tabel staan de constanten voor de lijnstijlen die beschikbaar zijn in Opmaak - Cellen - Randen:

Naam Constante

Geheel getal

Naam van de Lijnstijl

SOLID

0

Vast

DOTTED

1

Gestippeld

DASHED

2

Streepjes

FINE_DASHED

14

Fijne streepjes

DOUBLE_THIN

15

Dubbeldun

DASH_DOT

16

Streep punt

DASH_DOT_DOT

17

Streep punt punt


tip

Bekijk BorderLineStyle Constant Reference in de LibreOffice API-documentatie voor meer informatie over lijnstijlconstanten.


Randen opmaken met TableBorder2

Bereikobjecten hebben een eigenschap met de naam TableBorder2 die kan worden gebruikt om bereikranden op te maken zoals wordt gedaan in het dialoogvenster Opmaak - Cellen - Randen in het gedeelte Lijnschikking.

Naast boven-, onder-, linker- en rechterranden definieert TableBorder2 ook verticale en horizontale randen. De onderstaande macro past alleen de boven- en onderranden toe op het bereik "B2:E5".


    Sub TableBorder2Example
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Definieert de nieuwe lijnopmaak
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = cStyle.SOLID
        lineFormat.LineWidth = 15
        lineFormat.Color = RGB(0, 0, 0)
        ' Struct die de nieuwe TableBorder2-definitie opslaat
        Dim tableFormat as New com.sun.star.table.TableBorder2
        tableFormat.TopLine = lineFormat
        tableFormat.BottomLine = lineFormat
        tableFormat.IsTopLineValid = True
        tableFormat.IsBottomLineValid = True
        ' Past de tabelopmaak toe op het bereik "B2: E5"
        Dim oCell as Object
        oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
        oCell.TableBorder2 = tableFormat
    End Sub
  

De macro kan als volgt in Python worden geĆÆmplementeerd:


    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

Bekijk TableBorder2 Struct Reference in de LibreOffice API-documentatie voor meer informatie over de kenmerken ervan.


Help ons, alstublieft!