[РЕШЕНО] Копирование строки TextTable в LibreOffice Writer

Автор MBuyankin, 17 апреля 2019, 15:22

0 Пользователи и 1 гость просматривают эту тему.

MBuyankin

Добрый день!
Существует ли какая-то возможность выбрать и скопировать определенную строку таблицы в 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

rami

Цитата: MBuyankin от 17 апреля 2019, 15:22...как получить начало и конец области одной строки таблицы так и не смог разобраться.
Получите диапазон ячеек таблицы. См. пример:
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

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



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

Попробовал второй Select устанавливать на LasCell.End, но не помогло...

MBuyankin

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

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

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

MBuyankin

#5
Цитата: rami от 17 апреля 2019, 18:37
Для чего вам нужно дублировать строку таблицы?
Для программного построчного заполнения данными из базы.
По сути, это шаблон - строка и в ней в ячейках указаны параметры для замены. Необходимо по шаблону строки создать нужное их количество (если их больше 1) и заполнить их в соответствующем порядке.