Работа с LibreOffice, как с Com-объектом

Автор Борис_С, 22 октября 2021, 17:15

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

mikekaganski

Цитата: Борис_С от  2 декабря 2021, 15:26
Михаил, может вы подскажете, где можно посмотреть примеры работы С# с OpenOffice.

https://api.libreoffice.org/ - внизу страницы есть ссылка Examples.
С уважением,
Михаил Каганский

Борис_С

Владимир, я не понял, какие действия в MRI вы сделали, чтобы получить гиперссылки в выбранной ячейке?

sokol92

#32
Предположим, что в ячейке A1 есть гиперссылка с последующим простым текстом (итого две части).
Вызываем MRI:
mri ThisComponent
Переходим на вкладку Methods и далее (методы вызываются двойным щелчком):
1. Добираемся до ячейки A1 первого листа текущего документа:
- getSheets
- getbyIndex. Параметр: 0
- getCellByPosition. Параметры: 0, 0

Контрольная точка: на владке Properties свойство AbsoluteName имеет вид типа: $Sheet1.$A$1
Можно сразу получить объект для ячейки A1:
mri ThisComponent.Sheets(0).getCellByPosition(0,0)

2. Следуем тексту макроса А.Питоньяка.

 Получаем нумератор для текста:
- getText
- createEnumeration
- Можно получить все элементы нумератора с помощью пункта меню Macros / bundle.py / Inspect Elements of Enumeration Container
 
 Окно должно называться --nextElement() и быть единственным (пока) с этим названием.

3. Получаем элементы для вложенного нумератора.
- createEnumeration
- указанным выше способом получаем все элементы нумератора.
Здесь уже должно быть два элемента, соотвествующих гиперссылке и простому тексту.

Переходим на вкладку Properties и для каждого из этих элементов получаем TextPortionType.
Если TextPortionType="TextField" то:

- TextField
Если есть свойство URL, то получаем URL.
Владимир.

Борис_С

Это ясно. Самое интересное - продолжение.

sokol92

Владимир.

mikekaganski

@Борис_С: Вы пытаетесь "получить гиперссылки в выбранной ячейке" - и видимо, что-то не получается. Вы ожидаете, что остальные, кто пытается Вам помочь ответами на вопросы, дополнительно ещё должны придумать данные (лист с ячейками с *какими-то* гиперссылками - а что там: формула? гиперссылка по Ctrl+K?), полный код программы, создать проект, скомпилировать всё это, ...?

Для нормального обсуждения сделайте всё в Basic, который можно обсуждать, передавать и выполнять на системах других. Когда оно у Вас заработает в Basic, если требуется - переведите на C#. Тогда будет понятно, на каком уровне проблема. А то может быть, Вы просто ожидаете того, чего в ячейке и нет?
С уважением,
Михаил Каганский

Борис_С

На Basic это все давно реализовано и работает. Теперь мне нужно реализовать этот алгоритм на С# CLI. Как выясняется, эта совсем не просто. Проблема не в том, что в ячейке нет текста или гиперссылки. Проблема в том, что возникает исключение во время работы кода. Посмотрите код и Вы все поймете.

sokol92

Мне кажется, в подобных задачах проще использовать макросы, написанные на Basic и(или) Python и не мучаться. Из C# эти макросы можно (?) вызывать через invoke.
Владимир.

mikekaganski

Цитата: Борис_С от  2 декабря 2021, 19:01Посмотрите код и Вы все поймете

Ох. Что же тогда непонятно Вам? Лично мне непонятно из кода, что у Вас не работает, какие исключения... если оно работает на Basic, то Вы просто что-то не так перевели на #. И надо приложить очень много усилий, если скажем я не пишу на нём.
С уважением,
Михаил Каганский

Борис_С

Цитата: sokol92 от  2 декабря 2021, 19:21Мне кажется, в подобных задачах проще использовать макросы, написанные на Basic и(или) Python и не мучаться. Из C# эти макросы можно (?) вызывать через invoke.
Я не очень представляю, как это сделать. Володя, может быть Вы знаете как это сделать.

sokol92

...великий комбинатор играл в шахматы второй раз в жизни.  ;D

У меня не может быть знаний в этой области.  Могу только выдвигать предположения, которые Вы будете проверять. Если согласны, то можем все вместе проверить работоспособность вызова invoke из C# (готовых примеров не видно). Если у меня закончится доступ к LO, то продолжу через некоторое время.

Владимир.

mikekaganski

Цитата: sokol92 от  2 декабря 2021, 20:22Если у меня закончится доступ к LO

Обращайтесь, скинемся форумом на продление подписки ;)
С уважением,
Михаил Каганский

sokol92

Я с мобильника еще не научился работать с LO.  :(
Владимир.

sokol92

Начнем с простого. Борис, попробуйте вызвать из C# MyFunc1 в прилагаемом примере по образцу макроса testInvoke (там же).
Работа с массивами показана в ViewSample.cs из примеров по ссылке Михаила. Для получения объекта xScript из текущего документа MRI предлагает:

using System;
using unoidl.com.sun.star.script.provider;
using unoidl.com.sun.star.uno;

XScriptProviderSupplier xScriptProviderSupplier = (XScriptProviderSupplier) oInitialTarget;
XScriptProvider xScriptProvider = xScriptProviderSupplier.getScriptProvider();

XScript xScript = xScriptProvider.getScript("vnd.sun.star.script:Standard.Module1.Myfunc1?language=Basic&location=document");
Владимир.

mikekaganski

Цитата: mikekaganski от  2 декабря 2021, 18:31
Для нормального обсуждения сделайте всё в Basic, который можно обсуждать, передавать и выполнять на системах других. Когда оно у Вас заработает в Basic, если требуется - переведите на C#. Тогда будет понятно, на каком уровне проблема. А то может быть, Вы просто ожидаете того, чего в ячейке и нет?
Цитата: Борис_С от  2 декабря 2021, 19:01
На Basic это все давно реализовано и работает. Теперь мне нужно реализовать этот алгоритм на С# CLI. Как выясняется, эта совсем не просто. Проблема не в том, что в ячейке нет текста или гиперссылки. Проблема в том, что возникает исключение во время работы кода. Посмотрите код и Вы все поймете.

Может быть, тогда лучше было бы сделать так: Вы выкладываете код Basic, который работает, с тестовым примером, на котором Вы проверяете работоспособность #; и выкладываете код C#, реализующий определённый участок алгоритма. Мы смотрим, что не так.
С уважением,
Михаил Каганский