Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Как вставить OLE объект в Draw в LibreOffice?


Есть таблица в Calc. Есть страница с данными в Draw. Все сделано с помощью pyuno. Как вставить таблицу из Calc в Draw программно через pyuno?

Если просто сделать copy/paste, то это не то, что нужно. Нужно выполнить такие действия: 


  "Вставка" -> "Объект" -> "Объект OLE..." -> "Создать из файла" -> "Вводится имя файла документа Calc" -> "OK"


Как такое сделать через pyuno?

Пробовал через com.sun.star.frame.DispatchHelper, но не получилось. Выводит только окно с выбором типа объекта и дальше не идет.

У кого есть какие идеи?
    


Ответы

Ответ 1



Короткий ответ: не получится Длинный ответ: Команда InsertObject не до конца реализована. Соответственно нужен другой путь. Если вставить вручную объект в лист Draw и посмотреть на свойства вставленного объекта, то мы увидим объект OLE2Shape, у которого есть параметр EmbeddedObject, типа XEmbeddedObject. Создать из файла XEmbeddedObject, пользуясь только API можно, воспользовавшись недокументированным сервисом import uno import unohelper smgr = uno.getComponentContext().ServiceManager # fname - имя файла url = unohelper.systemPathToFileUrl(os.path.abspath(fname)) storageFactory = smgr.createInstance("com.sun.star.embed.StorageFactory") storage = storageFactory.createInstance() medium = (PropertyValue("URL", 0, url, 0), ) objDescr = (PropertyValue(), ) eoc = smgr.createInstance("com.sun.star.embed.EmbeddedObjectCreator") # недокументированный сервис, реализующий интерфейс com.sun.star.embed.XEmbedObjectCreator eo = eoc.createInstanceInitFromMediaDescriptor(storage, "TestObject", medium, objDescr) xeoType = uno.getTypeByName("com.sun.star.embed.XEmbeddedObject") xeo = eo.queryInterface(xeoType) # xeo уже содержит заргуженный объект. Если файл является файлом OpenOffice # можно получить доступ к документу через xeo.getComponent() Создать OLE2Shape и добавить на лист можно как описано на примере вставки диаграммы doc = XSCRIPTCONTEXT.getDocument() oleShape = doc.createInstance("com.sun.star.drawing.OLE2Shape") # создаем пустой объект doc.getDrawPages().getByIndex(0).add(oleShape) # добавляем объект на лист # oleShape.setSize(xeo.getVisualAreaSize(1)) # задаем размеры по загруженному XEmbeddedObject # oleShape.setPosition(Point(1000, 1000)) # задаем положение объекта на листе А вот теперь проблема. Нужно скрестить ужа и ежа, то есть вставить xeo в oleShape но у параметра EmbeddedObject есть только геттер, то есть этот параметр реализован в режиме "только чтение". Создать объект можно задавая параметр CLSID. Например для книги Calc'а oleShape.CLSID = "47BBB4CB-CE4C-4E80-a591-42d9ae74950f" Однако для привязки существующего XEmbeddedObject к OLE2Shape доступных путей в API нету. Идея для реализации задачи, описанной в вопросе пока только одна: загружать книг Calc в XEmbeddedObject, создавать OLE2Shape с пустой книгой и копировать нужный диапазон ячеек из XEmbeddedObject в OLE2Shape.EmbeddedObject. По сути - костыль, но других вариантов не найдено.

Комментариев нет:

Отправить комментарий