Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

15 Май 2021, 07:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 »   Вниз
  Печать  
Автор Тема: Выделение определенного слова, состояние ячеек  (Прочитано 1717 раз)
0 Пользователей и 1 Гость смотрят эту тему.
W1nterdreams
Участник
**
Offline Offline

Сообщений: 20


« Стартовое сообщение: 21 Январь 2021, 00:15 »

Можно ли как то решить такие задачи
1.если в тексте появляется определённое слово, его шрифт автоматически меняет цвет?
2. Информация в ячейке на момент открытия документа скажем а1 - 10 и на текущее время - что бы к концу дня отслеживать изменения в количестве
Записан
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #1: 21 Январь 2021, 00:21 »

1. Найти слово несложно, но если это часть строки, то изменить цвет можно только макросом обработав набор символов. В Excel я так делал: выделялось только то, что было задано шаблоном регулярного выражения.
2. Посмотрите в меню: Edit → Track Changes → Record|Manage...|Show...
Запись изменений (Record) добавляет комментарий к ячейке и информацию об изменении. Сама ячейка помещается в красную рамку.
Manage Changes позволяет перемещаться по соответствующим ячейкам. В принципе, удобно.
Отключение записи изменений приведет к сбрасыванию всей информации (рамки и комментарии будут удалены).
« Последнее редактирование: 21 Январь 2021, 00:38 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
W1nterdreams
Участник
**
Offline Offline

Сообщений: 20


« Ответ #2: 21 Январь 2021, 12:55 »

Да, это лишь часть строки, слово будет относить человека к определенной категории, нужно что бы оно выделялось из всего объема данных
Записан
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #3: 21 Январь 2021, 18:17 »

Вот зд. показано, как работать, на C++, правда:
https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Editing_Text

TextRange, TextCursor objects
« Последнее редактирование: 21 Январь 2021, 18:19 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 113


« Ответ #4: 21 Январь 2021, 21:52 »

Здесь выделение символов из текста в ячейке. Осталось найти "координаты" нужных символов в тексте
« Последнее редактирование: 21 Январь 2021, 22:00 от Bigor » Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #5: 21 Январь 2021, 22:19 »

Давайте попробуем решить эту задачу сообща.

В Excel я так делал: выделялось только то, что было задано шаблоном регулярного выражения.
Демокод. sPattern и oCellRange передаются в качестве параметров процедуры. Всё очень просто. Однако надо сделать и здесь. Это хорошая задача.
Property Characters ([Start], [Length]) As Characters

Код:
Dim re, sPattern$, cell, oCellRange, i%
Dim matches  'match collection
<...>
Set re = CreateObject("VBScript.RegExp")  'uses the external lib
re.Pattern = sPattern
For Each cell in oCellRange
    Set matches = re.Execute(cell)
    ' Highlight all matches in the current cell in red.
    For i = 0 To matches.Count - 1
        If matches(i).Length > 0 Then
            With cell.Characters(matches(i).FirstIndex + 1, matches(i).Length)
                .Font.Color = vbRed
            End With
        End If
    Next i
Next cell

UPD:
В Excel библиотека примитивная, но и её хватает. А что и как есть здесь? Как перебирать символы, мы, вроде, знаем, но нужен объект типа RegExp... Нужна информация о совпадениях и их размещении в строке.
Осталось найти "координаты" нужных символов в тексте
Чем искать будем?
« Последнее редактирование: 21 Январь 2021, 22:31 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 113


« Ответ #6: 21 Январь 2021, 22:31 »

Формулировка задачи слишком расплывчата, что бы что-то решать. "VBScript.RegExp" в линуксах не заработает и  cell.Characters скорее всего тоже.
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #7: 21 Январь 2021, 22:35 »

Предполагаю, да. Код выше приведён только для примера. Пусть выскажутся гуру и другие мастера и специалисты. Я пока не знаю...
Искать, вроде, тоже умеем... Однако, количество совпадений в одной ячейке может быть больше одного. Регэксы здесь очень помогают. Искать с помощью InStr() в цикле с сохранением последней позиции, что ли? Абсурд.
« Последнее редактирование: 21 Январь 2021, 22:39 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 113


« Ответ #8: 21 Январь 2021, 22:41 »

Я думаю InStr(). Напрягает
если в тексте появляется определённое слово
, т.е. подразумевается поиск не по подготовленному тексту, а отследить ввод.
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #9: 21 Январь 2021, 22:48 »

@Bigor, у автора частный случай. Надо обобщить задачу, что я и сделал в своём примере на Excel, и реализовать функцию, например
Function REGEX_SELECT(TextRange, Pattern, Flags) As Integer
которая выполнит задачу выделения цветом по умолчанию (красным) в выбранном диапазоне ячеек всех совпадений (matches) и вернёт их количество, за вычетом количества пустых совпадений (zero length strings). Как-то так... Тогда и нам самим это будет полезным.
« Последнее редактирование: 21 Январь 2021, 22:50 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 113


« Ответ #10: 21 Январь 2021, 22:50 »

Ну тогда вот еще из Питоньяка
Листинг 307. SearchSheet может быть найдена в модуле Calc в файле исходных текстов
этой главы SC14.sxc.
Код:
Sub SearchSheet
Dim oSheet
 'Лист для замены
Dim oReplace 'Дескриптор замены
Dim nCount
 'Выполненное количество замен
oSheet = ThisComponent.Sheets(3)
oReplace = oSheet.createReplaceDescriptor()
oReplace.setSearchString("Xyzzy")
oReplace.setReplaceString("Что-то еще")
oReplace.SearchWords = False
nCount = oSheet.replaceAll(oReplace)
MsgBox "Количество замен " & nCount
End Sub
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #11: 21 Январь 2021, 22:54 »

Так ведь нам нужны позиции совпадений (если их несколько) в одной строке, чтобы выделить вхождения цветом (индекс начала вхождения, длина).
Excel: >>> cell.Characters(matches(i).FirstIndex + 1, matches(i).Length)


Ищем sometext в строке "Sometext goes here and sometext once more."
Вызываем функцию REGEX_SELECT() в ячейке на листе, передав ей тестируемый диапазон, и получаем: результат поиска выделен красным, а в ячейке с функцией - количество совпадений (выделений) без учета пустых строк (If matches(i).Length > 0 Then).

Я не знаю: если объекта типа RegExp нет, то можно и в лоб реализовать, только будет не так компактно и красиво.
« Последнее редактирование: 21 Январь 2021, 23:00 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #12: 21 Январь 2021, 23:08 »

Конечно же, если бы у автора темы данные в ячейках были атомарными - а они должны такими и быть (то есть неделимыми), то всех этих проблем бы не было. Но сама процедура очень полезна для визуализации работы регулярного выражения и анализа сырых данных. Плюс для меня это восстановление нарушенной функциональности в связи с переходом на LO.  Улыбка

Я думаю InStr().
Это существенная потеря производительности.
« Последнее редактирование: 21 Январь 2021, 23:13 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 550



« Ответ #13: 21 Январь 2021, 23:16 »

Одно из известных мне заранее решений подоспело с другого форума:
"You can use Python or Java instead of silly Basic".

Да, я знаю Python и с модулем re работал тоже, но зд. на Python не переходил. Так как? Никак?

Странно, что Excel не реализует регэспы, но с помощью внешней библиотеки задача решается. В LO всё реализовано изначально, но доступа к модели regex нет.
« Последнее редактирование: 21 Январь 2021, 23:18 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 113


« Ответ #14: 21 Январь 2021, 23:17 »

Это существенная потеря производительности.
для выделения результата поиска нужно найти его начало в строке, и кроме InStr() я не знаю, что может его вернуть.
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Страниц: 1 2 3 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!