Получить ссылку на книгу к котрой принадлежит ячейка. (vb.net / createobject())

Автор PilgrimS, 4 декабря 2025, 08:50

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

PilgrimS

Соратники, прошу помощи в решении следующей задачи:
Код написан на Vb.Net (Visual Studio 2022)
Задача - работа с листами книги

       
oSM = CreateObject("com.sun.star.ServiceManager")
oDesk = oSM.CreateInstance("com.sun.star.frame.Desktop")
CurrentBook = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
'ссылка на лист
Sheet = CurrentBook.GetSheets().getByIndex(0)
range = sheet.GetCellRangeByName("A1")

В результате имеем в переменной range соответствующий объект с которым работаем дальше.
Теперь возникает потребность от данного объекта перейти к объекту CurrentBook который содержит данный range

Для получения листа использую
sh = range.getSpreadsheet()
В этом случае в Sh находится объект "лист".
А вот как от листа перейти к книге не знаю. Пробовал использовать Parent - говорит нет такого свойства.
Как посмотреть список доступных свойств/методов для созданного объекта тоже не знаю.

bigor

Цитата: PilgrimS от  4 декабря 2025, 08:50от данного объекта перейти к объекту CurrentBook который содержит данный range
не понял, у вас же CurrenBook уже задан, обращайтесь к нему и всё. А range ничего не знает о книге, он только лист и диапазон ячеек знает
Поддержать наш форум можно здесь

mikekaganski

Цитата: PilgrimS от  4 декабря 2025, 08:50Как посмотреть список доступных свойств/методов для созданного объекта тоже не знаю
Откройте Calc и воспользуйтесь Tools->Development Tools.

И да, этот объект не имеет такого свойства напрямую. Я не знаю способа проще, чем DrawPage->Forms->Parent.

Цитата: bigor от  4 декабря 2025, 10:14не понял, у вас же CurrenBook уже задан, обращайтесь к нему и всё.

Предположу (это не указано прямо в вопросе), что перейти к компоненту нужно из другого кода.
С уважением,
Михаил Каганский

PilgrimS

Все правильно В одном классе создан объект типа Range
Далее этот объект передается в другой класс. В нем необходимо получить определенное свойство книги к которому принадлежит лист на котором этот Range
Приходится делать вызов передавая 2 параметра book и range

Раз так сделать не получится - буду передавать 2 параметра
Фактически это влияет только на читаемость кода

sokol92

Цитата: PilgrimS от  4 декабря 2025, 13:21Раз так сделать не получится - буду передавать 2 параметра
Почему Вы сделали такой вывод? Михаил указал искомый путь:
oDoc = oRange.Spreadsheet.DrawPage.Forms.Parent
Кстати, я эту (олимпиадную) задачу пытался решить самостоятельно несколько месяцев после знакомства с LibreOffice (не решил), пока случайно на одном из форумов не увидел решение.

Кстати, такая же задача существует в отношении объекта SheetCellRanges. Когда этот контейнер не пуст, то можно взять его первый элемент и найти документ вышеуказанным способом. А как это сделать, если в контейнере нет элементов (свойство count = 0)?
Такое бывает сразу после создания контейнера:
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
Я эту задачу (нахождение документа) решаю с помощью "трюка". Если интересно, то можно обсудить.
Владимир.

PilgrimS

Благодарю Михаила за ответ, а Владимира за то что обратил мое внимание на это.
oDoc = oRange.Spreadsheet.DrawPage.Forms.ParentДействительно это то что нужно

PilgrimS

Цитата: sokol92 от  4 декабря 2025, 14:47Я эту задачу (нахождение документа) решаю с помощью "трюка". Если интересно, то можно обсудить.

К сожалению мои знания в LibreOffice не позволят что либо обсуждать - максимум я могу молча учиться у тех кто плотно работает с LO.

В настоящее время я решаю достаточно примитивную задачу - вывод достаточно простых отчетных форм в LO в программе написанной на VB.Net
Раньше все это у меня было реализовано на VB6. Там использовался диспатчер, но при переходе возникли проблемы с передачей параметров в диспатчер. Далее я решил попробовать CLI(там хоть свойства объектов можно видеть при написании кода) но работа этого механизма оказалась не стабильной (периодические зависания при создании книг). Поэтому пришел к com объектам и переменным "as Object" Вот и пишу собственный класс для работы (по аналогии с примерами для CLI) Проблема лишь в том что при таком способе - мало информациии о методах и свойствах и работа идет медленно.

Поэтому буду рад любым советам в данном направлении



sokol92

Цитата: PilgrimS от  5 декабря 2025, 05:47мало информациии о методах и свойствах
На мой взгляд, "must have" - гениальное расширение MRI, созданное @hanya (Tsutomu Uchino). Не пожалейте времени на изучение возможностей этой программы. Помимо прочего, программа умеет записывать Ваши действия на C++, C# CLI, Java, Python, Basic.
Также обратите внимание на тщательно подобранные пункты меню "Macros" расширения.

Не стесняйтесь задавать вопросы - будем рады помочь.
Владимир.

PilgrimS

Цитата: sokol92 от  5 декабря 2025, 13:53Не стесняйтесь задавать вопросы - будем рады помочь.
Спасибо за добрые слова. Буду изучать указанный инструмент