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

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

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

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Копирование диапозона с форматами  (Прочитано 717 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kadet
Форумчанин
***
Offline Offline

Сообщений: 404


« Стартовое сообщение: 24 Декабрь 2020, 20:49 »

Добрый день!
Извините за дилетантский вопрос, но ответа пока не нашёл.
Мне нужно скопировать диапазон ячеек вместе с форматами из одного документа в другой.
Такой макрос:
Код:
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" быстро и стабильно?
« Последнее редактирование: 24 Декабрь 2020, 20:50 от Kadet » Записан
sokol92
Форумчанин
***
Online Online

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


WWW
« Ответ #1: 24 Декабрь 2020, 21:25 »

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

Если нужно скопировать целиком лист, то можно воспользоваться методом importSheet.
« Последнее редактирование: 24 Декабрь 2020, 21:29 от sokol92 » Записан

Владимир.
Kadet
Форумчанин
***
Offline Offline

Сообщений: 404


« Ответ #2: 24 Декабрь 2020, 21:29 »

Спасибо! Почитаю.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 404


« Ответ #3: 24 Декабрь 2020, 22:13 »

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

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

Идеальный метод, как мне кажется, это данные перенести методом DataArray, а сверху "полирнуть" "кисточкой" (кнопка кисточки в меню calc - скопировать формат). А именно функцию этой "кисточки" я пока никак не найду. Т.е. - скопировать и перенести только формат выделения.
"Записать макрос" не помогает.
« Последнее редактирование: 24 Декабрь 2020, 22:23 от Kadet » Записан
sokol92
Форумчанин
***
Online Online

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


WWW
« Ответ #4: 25 Декабрь 2020, 14:04 »

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

Владимир.
rami
Гуру
*******
Offline Offline

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #5: 25 Декабрь 2020, 15:47 »

Попробуйте такой вариант, только учтите, что данные копируются не из текущего документа, а с его файла на диске, не сохранённые изменения не будут скопированы:
Код:
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
Форумчанин
***
Offline Offline

Сообщений: 404


« Ответ #6: 28 Декабрь 2020, 22:37 »

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

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


iMac, LibreOffice и Apache OpenOffice


« Ответ #7: 29 Декабрь 2020, 10:04 »

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

Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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