Пометить части текста ячейки полужирным шрифтом в Libreoffice Calc Basic?

Я знаю, что в электронной таблице localc можно вручную отредактировать текст ячейки и пометить часть текста в ней жирным шрифтом, курсивом или чем-то еще.

Я хочу сделать то же самое с макросом. Я создаю итоговую строку, которая вставляется в определенную ячейку. Итоговая строка содержит несколько строк, например:

Категория1: элемент1, элемент2, элемент3
Категория2: элемент1, элемент2, ...
КатегорияN: элемент1, элемент2, ...

В ячейке может быть от ~ 4 до ~ 12 строк категорий, в зависимости от того, была ли данная категория пустой или нет.

Функция, которую я должен делать, работает, делает именно то, что я пока хочу. Но теперь я хочу выделить части ячейки "категории" следующим образом:

Категория1: элемент1, элемент2, элемент3
Категория2: элемент1, элемент2, ...
КатегорияN: элемент1, элемент2 , ...

Возможно ли это сделать в LO Basic? Я знаю, что это возможно с ручным редактированием в ячейке, но это уничтожит всю цель написания этого сценария.

Это то, что у меня есть до сих пор, в нижней части функции, которая создает итоговую строку и вставляет ее в объект ячейки (названный, как ни странно, "ячейкой"):

newline = chr(10)
cell  = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills")



Dim next_nl as Integer
Dim next_colon as Integer
Dim TC as Object ' TextCursor object pointing into the cells text

TC = cell.createTextCursor

next_nl=1 ' start at first char of cell

While (next_nl > 0)
    TC.collapseToStart
    TC.gotoStart(false)  ' move to start of cell

    if (next_nl > 1) Then TC.goRight(next_nl, false) ' move to next_nl

    TC.goRight(0,true) ' begin selection

    next_colon = InStr(next_nl, cell.String, ":")

    If next_colon Then
        TC.goRight(next_colon, true) ' extend selection to next colon
        TC.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection
        next_nl = InStr(next_colon, cell.String, newline) ' jump to the next LF
    Else
        next_nl = 0 ' no more colons to be found, finish up.'
    Endif

Wend

Частично это работает. В первой строке выделена категория жирным шрифтом, а элементы - обычным текстом. Пока что идеально.

К сожалению, все от начала второй строки до примерно середины второй последней строки (да? Что? Это странно) полностью выделено жирным шрифтом. Я подозреваю, что, возможно, Instr() не совсем правильно работает с текстом смешанного формата, неправильно подсчитывает количество символов.

Другие вещи, которые я пробовал / идеи:

  • Я пробовал искать CR chr(13), а не LF chr(10), но это вообще не сработало. Я ожидал, что он будет использовать окончания строк MS-DOS CR, но он использует правильные окончания строк unix LF (даже если вы добавляете CR между строками, он преобразует их в LF). Это может быть связано с тем, что я работаю в Linux, поэтому, когда я получу эту работу, я, вероятно, должен определить рабочую среду и использовать соответствующий стиль окончания строки для Linux, Windows или чего-то еще.

  • Я попытался переместить Tc=cell.createTextCursor внутри цикла while на случай, если его нужно повторно инициализировать на каждом проходе. Без разницы, результат в любом случае будет тот же.

    AFAICT, похоже, для курсора нет функции типа «сбросить выбор».

  • может быть, есть какая-то странная проблема с областью видимости переменных, но у меня почти нулевые знания об области видимости переменных в LO, поэтому не могу сказать - я новичок в макросах LO, я в основном программирую на sh, awk, perl или python, и последний Время, когда я писал что-либо на Basic, было в 1980-х.

  • Я даже не уверен, что приведенное выше - хороший подход к проблеме, это было первое, что показалось актуальным при поиске документации в Google. Я более чем готов начать все сначала с лучшей идеей, если это необходимо.

  • Я начинаю думать, что именованный диапазон «Навыки» должен состоять из одной ячейки на категорию, а не одной большой длинной строки со встроенными LF, тогда я мог бы прокручивать их по отдельности. Для этого мне потребовалось бы внести довольно существенные изменения в другие части электронной таблицы, поэтому я не хочу этого делать, если мне не нужно.

PS: Я знаю ... Я немного перфекционист. Верхний регистр названий категорий будет работать (на самом деле, это так), но это некрасиво. Выделить их полужирным шрифтом было бы намного приятнее ... и цель этой страницы сводки - для красивой презентации.


person cas    schedule 08.05.2017    source источник
comment
Уважаемый анонимный отрицательный голос, я знаю, что этот вопрос касается языка программирования, который случайно встроен в электронную таблицу. Но это все еще вопрос программирования, а не вопрос использования приложения, это не формулы ячеек или какой-либо другой вопрос приложения, более подходящий для SuperUser или службы поддержки. Это программирование, даже если оно базовое. В электронной таблице. Есть много других вопросов о еще большем количестве игрушечных языков на SO.   -  person cas    schedule 08.05.2017
comment
Может быть, он был отклонен, потому что это был довольно длинный вопрос? Хотя мне это кажется прекрасным. Подробности полезны.   -  person Jim K    schedule 08.05.2017
comment
да, я более склонен отвечать на вопросы, если спрашивающий показывает, что они пытались разобраться самостоятельно, и предоставляет полезные детали, например, что они пытаются сделать (в случае, если это проблема XY или, что еще хуже, WTF?) .   -  person cas    schedule 09.05.2017


Ответы (1)


InStr() отлично работает даже в Windows. Рядом с goRight() была простая ошибка.

Sub BoldPartOfCell
    Dim next_nl As Integer  ' position of the next newline
    Dim next_colon As Integer
    Dim cursor As Object  ' TextCursor object pointing into the cell's text

    NEWLINE = Chr(10)  ' the LibreOffice line break character
    cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills")
    cursor = cell.createTextCursor
    next_nl = 1  ' start at first char of cell
    Do While True
        cursor.collapseToStart
        cursor.gotoStart(False)  ' move to start of cell
        if (next_nl > 1) Then cursor.goRight(next_nl, False) ' move to next_nl
        next_colon = InStr(next_nl, cell.String, ":")
        If next_colon > 0 Then
            ' extend selection to next colon
            cursor.goRight(next_colon - next_nl + 1, True)
            cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD  ' bold the selection
            next_nl = InStr(next_colon, cell.String, NEWLINE)  ' jump to the next LF
        Else
            Exit Do
        End If
    Loop
End Sub
person Jim K    schedule 08.05.2017
comment
Идеально! Большое тебе спасибо. и ... ну! Я знал, что goRight () относился к текущей позиции, но рассматривал ее как абсолютную. Кстати, определения ячеек и новой строки были изолированы в верхней части моего образца кода, чтобы показать контекст - они были взяты ранее в исходной подпрограмме. Теперь, когда я вижу ошибку, я превращаю ее в подпрограмму и обобщаю на что-то вроде Sub BoldPartOfCell(cell as Object, ByVal BoldStart as String, ByVal BoldStop as String) - person cas; 09.05.2017