Содержимое

# Форматирование обрамления в 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 принимает четыре аргумента:

- cellAddress — строка с диапазоном, к которому применяется формат "A1".

- newStyle — целочисленное значение, соответствующее стилю линии обрамления (см. ниже Стили линии).

- newWidth — целочисленное значение, определяющее толщину линии.

- newColor — целочисленное значение цвета, соответствующее результату работы функции RGB.

Для вызова 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 для получения более подробной информации о её атрибутах.

См. также

The ScriptForge Library