Копирование диапозона с форматами

Автор Kadet, 24 декабря 2020, 20:49

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

Kadet

Добрый день!
Извините за дилетантский вопрос, но ответа пока не нашёл.
Мне нужно скопировать диапазон ячеек вместе с форматами из одного документа в другой.
Такой макрос:
Sub TOVostatki1(oEvent)
Dim oSheet As Object, vComp, oSheet1, oData

oSheet = ThisComponent.sheets(0)
oData = oSheet.getCellRangeByName("A1:S50").DataArray

sURL = "private:factory/scalc"
vComp = StarDesktop.LoadComponentFromUrl(sURL, "_blank", 0, Array())

oSheet1 = vComp.sheets(0)
oSheet1.getCellRangeByName("A1:S50").DataArray = oData

vComp.sheets(0).getColumns().OptimalWidth = True

End Sub

Прекрасно копирует, но только данные, без форматов.
copyRange как-то не получается прикрутить - из одного документа в другой.
Отдельно скопировать форматы диапазона тоже не получается.
Copy/Paste через буфер диспетчера - работает медленно и часто зависает.

Можно ли это сделать по типу "DataArray" быстро и стабильно?

sokol92

#1
Методы для копирования диапазонов из одного документа в другой описаны в книге А.Питоньяка OOME_4_0.odt, раздел 15.5.5. Методы интерфейса XTransferableSupplier имеют ожидаемое быстродействие.

Если нужно скопировать целиком лист, то можно воспользоваться методом importSheet.
Владимир.

Kadet


Kadet

#3
Почитал, попробовал.
Спасибо! Вроде бы получилось. Методы getTransferable() и insertTransferable() работают.

Однако, всё таки хотелось бы немного по другому. Дело в том, что Transferable() переносит всё подряд, как и буфер обмена.
А у меня там чекбоксы и кнопки. И их не хотелось бы переносить. В создаваемом документе они лишние.

Идеальный метод, как мне кажется, это данные перенести методом DataArray, а сверху "полирнуть" "кисточкой" (кнопка кисточки в меню calc - скопировать формат). А именно функцию этой "кисточки" я пока никак не найду. Т.е. - скопировать и перенести только формат выделения.
"Записать макрос" не помогает.

sokol92

#4
Мне не удалось найти аналога "специальной вставки" (команда Диспетчера .uno:InsertContents) среди методов UNO.
Через эту команду диспетчера с помощью параметра Flags можно вставить именно те части, которые необходимо (за один вызов): S тексты; V числа; D даты и время; F формулы; N комментарии; T форматы.
Владимир.

rami

Попробуйте такой вариант, только учтите, что данные копируются не из текущего документа, а с его файла на диске, не сохранённые изменения не будут скопированы:
Sub TOVostatki2()
Dim oCellAddress As New com.sun.star.table.CellAddress, sURL$, oSource$, vComp
oCellAddress.Sheet = 0
oCellAddress.Row = 0
oCellAddress.Column = 0

sURL = ConvertToURL(ThisComponent.URL)
oSource = "A1:S50"

vComp = StarDesktop.LoadComponentFromUrl("private:factory/scalc", "_blank", 0, Array())

vComp.AreaLinks.insertAtPosition(oCellAddress, sUrl, oSource, "", "")
vComp.AreaLinks.removeByIndex(0)

vComp.sheets(0).getColumns().OptimalWidth = True
End Sub

Kadet

Цитата: rami от 25 декабря 2020, 15:47Попробуйте такой вариант, только учтите, что данные копируются не из текущего документа, а с его файла на диске, не сохранённые изменения не будут скопированы:
Не, такой вариант не получается. У меня файла-источника нет. Он каждый раз создаётся заново и на диске не существует.

rami

Цитата: Kadet от 24 декабря 2020, 22:13Дело в том, что Transferable() переносит всё подряд, как и буфер обмена.
А у меня там чекбоксы и кнопки. И их не хотелось бы переносить. В создаваемом документе они лишние.
Перенести всё, а затем объекты можно удалить методом .clearContents(128), это будет проще, чем переносить по частям.