Formatierung von Rändern in Calc mit Makros

Makros für die Formatierung von Zellbereichen in Calc können in den Programmiersprachen Basic oder Python geschrieben werden.

Ränder in Zellbereichen formatieren

Der folgende Codeausschnitt erstellt ein Sub namens FormatCellBorder, das neue Rahmenformate auf eine bestimmte Bereichsadresse in der aktuellen Calc-Tabelle anwendet.


    Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
        ' Erstellt die UNO-Struktur, die das neue Zeilenformat speichern wird
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = newStyle
        lineFormat.LineWidth = newWidth
        If Not IsMissing(newColor) Then lineFormat.Color = newColor
        ' Ruft die Zielzelle auf
        Dim oCell as Object
        Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
        ' Wendet das neue Format auf alle Rahmen an
        oCell.TopBorder = lineFormat
        oCell.RightBorder = lineFormat
        oCell.LeftBorder = lineFormat
        oCell.BottomBorder = lineFormat
    End Sub
  

Das oben beschriebene Sub enthält vier Argumente:

Um FormatCellBorder aufzurufen, erstellen Sie ein neues Makro und übergeben Sie die gewünschten Argumente, wie unten gezeigt:


    Sub MyMacro
        ' Ermöglicht den Zugriff auf die Linienstil-Konstanten
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Formatiert "B5" mit durchgezogenem blauen Rahmen
        FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
        ' Formatiert alle Rahmen im Bereich "D2:F6" mit rot gepunkteten Rändern
        FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
    End Sub
  

Es ist möglich, die selbe Funktionalität in Pyhton zu implementieren:


    from uno import createUnoStruct
    from scriptforge import CreateScriptService
    
    def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
        # Definiert das neue Linienformat
        line_format = createUnoStruct("com.sun.star.table.BorderLine2")
        line_format.LineStyle = newStyle
        line_format.LineWidth = newWidth
        line_format.Color = newColor
        # Dienst Scriptforge für den Zugriff auf Zellbereiche
        doc = CreateScriptService("Calc")
        cell = doc.XCellRange(cellAddress)
        cell.TopBorder = line_format
        cell.RightBorder = line_format
        cell.LeftBorder = line_format
        cell.BottomBorder = line_format
  

Der folgende Codeausschnitt implementiert ein Makro mit dem Namen myMacro, das formatCellBorder aufruft:


    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

Der oben vorgestellte Python-Code verwendet die Bibliothek ScriptForge, welche seit LibreOffice 7.2 verfügbar ist.


Linienstile

Line styles are defined as integer constants. The table below lists the constants for the line styles available in Format - Cells - Borders:

Constant name

Integer value

Line style name

SOLID

0

Solid

DOTTED

1

Gepunktet

DASHED

2

Dashed

FINE_DASHED

14

Fine dashed

DOUBLE_THIN

15

Double thin

DASH_DOT

16

Dash dot

DASH_DOT_DOT

17

Dash dot dot


tip

Refer to the BorderLineStyle Constant Reference in the LibreOffice API documentation to learn more about line style constants.


Formatting Borders Using TableBorder2

Range objects have a property named TableBorder2 that can be used to format range borders as it is done in the Format - Cells - Borders dialog in the Line Arrangement section.

In addition to top, bottom, left and right borders, TableBorder2 also defines vertical and horizontal borders. The macro below applies only the top and bottom borders to the range "B2:E5".


    Sub TableBorder2Example
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Defines the new line format
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = cStyle.SOLID
        lineFormat.LineWidth = 15
        lineFormat.Color = RGB(0, 0, 0)
        ' Struct that stores the new TableBorder2 definition
        Dim tableFormat as New com.sun.star.table.TableBorder2
        tableFormat.TopLine = lineFormat
        tableFormat.BottomLine = lineFormat
        tableFormat.IsTopLineValid = True
        tableFormat.IsBottomLineValid = True
        ' Applies the table format to the range "B2:E5"
        Dim oCell as Object
        oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
        oCell.TableBorder2 = tableFormat
    End Sub
  

The macro can be implemented in Python as follows:


    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

Refer to the TableBorder2 Struct Reference in the LibreOffice API documentation to learn more about its attributes.