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

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

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

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Копирование строки TextTable в LibreOffice Writer  (Прочитано 538 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MBuyankin
Новичок
*
Offline Offline

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


« Стартовое сообщение: 17 Апрель 2019, 15:22 »

Добрый день!
Существует ли какая-то возможность выбрать и скопировать определенную строку таблицы в Writer?
В коде приведенном ниже ловлю ошибку при попытке выделения по конец последней ячейки строки. Насколько я понял, проблема в том что, я в методе gotoRange использую 2 разные области TextRange. Но как получить начало и конец области одной строки таблицы так и не смог разобраться.
Похожую операцию в MS Word выполнял без проблем, а здесь столкнулся с неожиданными проблемами.
Возможно, эту операцию вообще стоит выполнять по-другому.
Заранее спасибо за помощь!
Код:
Sub Main

xDocument = ThisComponent
Table = xDocument.TextTables.getByIndex(0)
FirstCell = Table.getCellByPosition(0, 0)
LastCell = Table.getCellByPosition(Table.Columns.Count - 1, 0)

oTxtCrsr = xDocument.getCurrentController().getViewCursor()
oTxtCrsr.gotoRange(FirstCell.Start, False)
oTxtCrsr.gotoRange(LastCell.End, True)

TransferableObject = xDocument.getCurrentController().Frame.controller.getTransferable()
xDocument.getCurrentController().insertTransferable(TransferableObject)

End Sub

* Test Copy.odt (9.12 Кб - загружено 2 раз.)
« Последнее редактирование: 17 Апрель 2019, 18:31 от MBuyankin » Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 17 Апрель 2019, 17:09 »

...как получить начало и конец области одной строки таблицы так и не смог разобраться.
Получите диапазон ячеек таблицы. См. пример:
Код:
Sub main
Dim doc, oTextTables, oCellRange, oCurrentController, oViewCursor, oTextCursor

doc = ThisComponent
oCurrentController = doc.CurrentController

oViewCursor = oCurrentController.ViewCursor
oTextCursor = doc.Text.createTextCursorByRange(oViewCursor)

oTextTables = doc.TextTables(0)
oCellRange = oTextTables.getCellRangeByName("A1:C1")

oCurrentController.select(oCellRange)

TransferableObject = oCurrentController.getTransferable()

oCurrentController.select(oTextCursor)

oCurrentController.insertTransferable(TransferableObject)

End Sub
Записан

MBuyankin
Новичок
*
Offline Offline

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


« Ответ #2: 17 Апрель 2019, 18:01 »

Спасибо! Заработало.
Но есть один момент:



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

Попробовал второй Select устанавливать на LasCell.End, но не помогло...
Записан
MBuyankin
Новичок
*
Offline Offline

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


« Ответ #3: 17 Апрель 2019, 18:30 »

Разобрался. В следующем виде работает. Не знаю насколько это оптимально и корректно, но задачу решает )
Ещё раз спасибо за помощь!

Код:
Sub main
Dim doc, oTextTables, oCellRange, oCurrentController, oViewCursor, oTextCursor, oFirstCell_LastRow

doc = ThisComponent
oCurrentController = doc.CurrentController

rem oViewCursor = oCurrentController.ViewCursor
rem oTextCursor = doc.Text.createTextCursorByRange(oViewCursor)

oTextTables = doc.TextTables(0)
oCellRange = oTextTables.getCellRangeByName("A1:D1")

oTextTables.Rows.insertByIndex(oTextTables.Rows.Count, 1)
oFirstCell_LastRow = oTextTables.getCellByPosition(0, oTextTables.Rows.Count-1)

oCurrentController.select(oCellRange)

TransferableObject = oCurrentController.getTransferable()

oCurrentController.select(oFirstCell_LastRow.Start)

oCurrentController.insertTransferable(TransferableObject)

End Sub
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #4: 17 Апрель 2019, 18:37 »

Для чего вам нужно дублировать строку таблицы?
Записан

MBuyankin
Новичок
*
Offline Offline

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


« Ответ #5: 17 Апрель 2019, 18:45 »

Для чего вам нужно дублировать строку таблицы?
Для программного построчного заполнения данными из базы.
По сути, это шаблон - строка и в ней в ячейках указаны параметры для замены. Необходимо по шаблону строки создать нужное их количество (если их больше 1) и заполнить их в соответствующем порядке.
« Последнее редактирование: 17 Апрель 2019, 18:48 от MBuyankin » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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