Форматирование обрамления в Calc с применением макросов

Языки программирования Basic или Python позволяют писать макросы, которые применяют форматирование к диапазонам ячеек в Calc.

Форматирование обрамления для диапазона ячеек

В примере кода внизу создаётся Sub с именем FormatCellBorder, который применяет новые форматы обрамления к заданному адресу диапазона на текущем листе Calc.


    Sub FormatCellBorder(cellAddress as String, newStyle as Byte, newWidth as Long, Optional newColor as Long)
        ' Создаёт структуру UNO, в которой будет храниться новый формат линии
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = newStyle
        lineFormat.LineWidth = newWidth
        If Not IsMissing(newColor) Then lineFormat.Color = newColor
        ' Получает целевую ячейку
        Dim oCell as Object
        Set oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellAddress)
        ' Применяет новый формат ко всем границам
        oCell.TopBorder = lineFormat
        oCell.RightBorder = lineFormat
        oCell.LeftBorder = lineFormat
        oCell.BottomBorder = lineFormat
    End Sub
  

Описанный выше Sub принимает четыре аргумента:

Для вызова FormatCellBorder необходимо создать макрос и передать необходимые аргументы как показано ниже:


    Sub MyMacro
        ' Предоставляет доступ к константам стиля линии
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Применяет к "B5" формат со сплошным синим обрамлением
        FormatCellBorder("B5", cStyle.SOLID, 20, RGB(0, 0, 255))
        ' Задаёт формат всех границ диапазона "D2:F6" красным пунктирным обрамлением
        FormatCellBorder("D2:F6", cStyle.DOTTED, 20, RGB(255, 0, 0))
    End Sub
  

Точно такой же функционал можно реализовать и с помощью Python:


    from uno import createUnoStruct
    from scriptforge import CreateScriptService
    
    def formatCellBorder(cellAddress, newStyle, newWidth, newColor=0):
        # Определяет формат новой линии
        line_format = createUnoStruct("com.sun.star.table.BorderLine2")
        line_format.LineStyle = newStyle
        line_format.LineWidth = newWidth
        line_format.Color = newColor
        # Служба Scriptforge позволяет получить доступ к диапазонам ячеек
        doc = CreateScriptService("Calc")
        cell = doc.XCellRange(cellAddress)
        cell.TopBorder = line_format
        cell.RightBorder = line_format
        cell.LeftBorder = line_format
        cell.BottomBorder = line_format
  

Представленный ниже код представляет собой макрос с именем myMacro, в котором выполняется вызов 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))
  
Значок примечания

Выше представлен код Python, в котором используется Библиотека ScriptForge, применяющаяся, начиная с версии LibreOffice 7.2.


Стили линий

Стили линии определяются целочисленными константами. В таблице внизу перечисляются константы для стилей линии, доступных в меню Формат - Ячейки - Обрамление:

Имя константы

Целое значение

Имя стиля линии

SOLID

0

Сплошная

DOTTED

1

Пунктир

DASHED

2

Штриховая

FINE_DASHED

14

Тонкий штрих

DOUBLE_THIN

15

Двойная тонкая

DASH_DOT

16

Штрихпунктир

DASH_DOT_DOT

17

Штрих точка точка


Значок подсказки

См. Справочник констант стилей линии обрамления в документации API LibreOffice для получения более подробной информации о константах стиля линии.


Форматирование обрамления с помощью TableBorder2

У объектов диапазона имеется свойство с именем TableBorder2, которое можно использовать для форматирования границ диапазона ячеек, как это делается в диалоговом окне Формат - Ячейки - Обрамление в разделе Положение линий.

В дополнение к верхней, нижней, левой и правой границам TableBorder2 также содержит определение вертикальных и горизонтальных границ. В макросе ниже к диапазону "B2:E5" применяется только верхняя и нижняя граница.


    Sub TableBorder2Example
        Dim cStyle as Object
        Set cStyle = com.sun.star.table.BorderLineStyle
        ' Определяет формат новой линии
        Dim lineFormat as New com.sun.star.table.BorderLine2
        lineFormat.LineStyle = cStyle.SOLID
        lineFormat.LineWidth = 15
        lineFormat.Color = RGB(0, 0, 0)
        ' Структура с новым определением TableBorder2
        Dim tableFormat as New com.sun.star.table.TableBorder2
        tableFormat.TopLine = lineFormat
        tableFormat.BottomLine = lineFormat
        tableFormat.IsTopLineValid = True
        tableFormat.IsBottomLineValid = True
        ' Применяет формат таблицы к диапазону "B2:E5"
        Dim oCell as Object
        oCell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2:E5")
        oCell.TableBorder2 = tableFormat
    End Sub
  

Макрос может применяться в Python следующим образом:


    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
  
Значок подсказки

См. Справочник структуры TableBorder2 в документации API LibreOffice для получения более подробной информации о её атрибутах.


Пожалуйста, поддержите нас!

Пожалуйста, поддержите нас!