Доступ к OLE-таблице внедрённую во Writer (Embed)

Автор Kadet, 2 ноября 2018, 21:42

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

Kadet

Добрый день!
Нигде не смог найти ответ на этот вопрос.
В LO Writer есть возможность вставить таблицу Calc с помощью фрейма (Вставка->Врезка->Фрейм).
В документе Writer формируется новая таблица с помощью private:factory/scalc (в свойствах фрейма в поле "Содержимое" прописываю - private:factory/scalc и при открытии документа создаётся новая таблица).

К фрейму можно получить доступ через:
ThisComponent.EmbeddedObjects(0).EmbeddedObject.getComponent()
Получаем элемент типа - "com.sun.star.comp.sfx2.IFrameObject"

Процедура Питоньяка "Documents_Iteration()" (проверяет все открытые документы - StarDesktop.getComponents()) определяет эту таблицу как отдельно открытый документ и идентифициет её как объект - "com.sun.star.script.BasicIDE", но не как таблицу Calc.

Никак не могу найти пути доступ к этой таблице внутри этого фрейма через макрос, чтобы заполнять ячейки.
При этом вручную ячейки заполняются без проблем.

Образец документа во вложении.

rami

То, что вы считаете таблицей (ваш EmbeddedObject), на самом деле таблицей не является, а только выглядит как таблица. Этот объект получает данные из указанного источника в момент открытия (в вашем случае объект получает пустые данные из пустого шаблона private:factory/scalc), вы можете редактировать данные, но они существуют только в оперативной памяти, пока открыт документ. Сохранять эти данные некуда, связь с исходным документом существует только в момент загрузки данных, а дальше утрачивается. Но самое главное ваш EmbeddedObject не содержит Component, т.е. он просто "пустышка", с ним можно работать как с "рамкой" (фреймом), но не как с таблицей.

Чтобы сделать то, что вы хотите (редактировать, сохранять данные, получить программный доступ к компоненту электронной таблицы) нужно установить постоянную связь с документом Calc, в этом случае у EmbeddedObject появляется Component с которым можно работать (программно) как с обычной таблицей.

Объект создаётся так: меню Вставка —> Объект —> Объект OLE... —> выбрать Создать из файла, установить связь с файлом.

Kadet

#2
Да в принципе мне и нужна пустышка для удобного форматированного отображения данных. Их не нужно сохранять. Некую альтернативу ищу стандартным таблицам в формах Base, где возможностей по форматированию и удобного представления данных в принципе нет. Ни тебе промежуточных сумм, ни цветовых возможностей. В общем - практически ничего. А TextTable - тормоза ещё те при их заполнении. Большие объёмы не для них.

Ваш пример я изучал. В принципе такой же OLE-объёкт получается и простым копированием из Calc во Writer через буфер. И даже можно создавать новый (пустой) документ. Но в таком варианте есть существенное неудобство. Для того, чтобы вносить изменения в подобную таблицу в реалтайме она должна быть активной. А при её активизации (двойным щелчком по фрейму) весь документ превращается в Calc, включая панель управления и т.п. Это задержка, перегрузка, всякие скачки экрана и т.п. Мало того - в формах Base в рабочем режиме двойной щелчёк не работает. А если таблицу не активизировать в ней те отображаются текущие изменения. Заносятся куда-то в буфер. К тому же - при её заполнении часто валится база.

Однако позвольте с вами не согласиться в том, что мой вариант таблицы - это пустышка и вовсе никакая не таблица. Это обычная calc-таблица хотя бы потому, что она позволяет работать всему функционалу calc. В ручную в неё можно заносить данные, изменять, форматировать, заливать цветом, копировать и вставлять, удалять и добавлять листы и пр. Именно поэтому стоит считать её именно полноценным calc документом. Мало того - этому документу автоматом присваивается имя - "Без имени 2" и процедура Питоньяка определяет её как отдельно открытый документ, хотя и не распознаёт его как Calc. По этим признакам этот документ не более пустышка кэша, чем скажем вновь созданный, но ещё не сохранённый документ через - oDoc = StarDesktop.loadComponentFromURL(private:factory/scalc ,"_blank",0,Array()). А с таким документом (oDoc) можно работать. Значит и с моим вариантом, в теории, тоже должна быть возможность работать. Главный вопрос - КАК до него достучаться.

economist

"...найти пути доступ к этой таблице внутри этого фрейма через макрос, чтобы заполнять ячейки..." - для того чтобы из больших данных делать делать выборку и раскрашивать как надо - как раз и существует механизм ЛЮБАЯСУБД-ODB-ODT/ODS, позволяющий без макросов - простой текст "втянуть" в форматированный документ и отформатировать его (а также в терминах Writer - скрыть/показать или задействовать в вычислениях) силами самого Writer (его стилями). Это все делается через Ctrl+Shift+F4 и стилиста, F11.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

#4
economist попробуйте стандартными средствами реализовать хотя бы двух-трёхуровневую таблицу с промежуточными итогами по каждому уровню. Допустим такую, как во вложении. Причём таблица динамическая и подвержена частым изменениям, в общем -  рабочая. Плюс необходима фильтрация данных по многим критериям. Плюс всё это должно меняться в реалтайме. Плюс с таблицей работает целый коллектив и каждый вносит своим изменения.
Стандартные возможности не удовлетворяют. Таблицы форм простейшие "одноклеточные амёбы", а текстовые таблицы по 5 мин. формируются.

Однако вопрос о том как добраться до таблицы во фрейме.

rami

Цитата: Kadet от  3 ноября 2018, 18:27Мало того - этому документу автоматом присваивается имя - "Без имени 2" и процедура Питоньяка определяет её как отдельно открытый документ, хотя и не распознаёт его как Calc.
Когда присваивается имя "Без имени 2" ? После нажатия на гиперссылку под таблицей?

Kadet

Под таблицей нет гиперссылки. В свойствах пусто.

rami

В первом посте вы выложили документ FomCOL.odt в нём есть внедрённая таблица, а под ней гиперссылка. Или вы говорите о каком-то другом документе нам не известном?

economist

#8
Цитата: Kadet от  4 ноября 2018, 08:38economist - попробуйте стандартными средствами реализовать хотя бы двух-трёхуровневую таблицу с промежуточными итогами по каждому уровню... Причём таблица динамическая и подвержена частым изменениям... Плюс необходима фильтрация данных по многим критериям. Плюс всё это должно меняться в реалтайме. Плюс с таблицей работает целый коллектив и каждый вносит своим изменения.

Звучит адово для внедренца (если это онлайн-таблица заказа). Необходимо всё-таки разграничить интерфейсы продажника, аналитика, бухгалтера итп. А еще -  я почти уверен что "доступ к этой таблице внутри этого фрейма через макрос" во Writer - получить не удастся вообще. Во Writer куча всего, к чему не достучатся макросами. Формируйте таблицу в чем-то фиксированно-живом: в Calc, Base. Обменивайтесь после определенной стадии "бизнес-процесса": согласован/предоплачен итп. Для этого в мире LO, кмк, годится не всё, а лишь TXT-файл или файл базы данных (*.odb). Но никак не ODT/ODS, не имеющие в сию секунду статуса "Готов". Все эти OLE/COM/DDE - годны лишь когда работаешь один или по-очереди.

А 3-х уровневая таблица с пересчетом погонажа через плотность в вес, м2 итп - даже в самом сложном случае делается в свойствах форм Base - SELECT-запросами вида:

SELECT ... FROM ... WHERE ...
UNION ALL
SELECT ... FROM ... WHERE ...
UNION ALL
SELECT ... FROM ... WHERE ...
UNION ALL
итд

Хотя GROUP BY, если есть конкретное поле для группировки - проще.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Цитата: Kadet от  4 ноября 2018, 08:38а текстовые таблицы по 5 мин. формируются.
- вот этого быть не должно. С использованием StarBasic - тысячестрочные таблицы во Writer  - формируются из любой базы данных или TXT/CSV-файла - за доли секунды-секунду. Отражение (обновление) во Writer неформатированной таблицы из базы данных (любой), даже без средств Basic, - занимает 1,5 секунды + время выполнения запроса. То есть это в любом случае секунды, а не минуты.

Kadet - вас должно насторожить что никто тут и "там" - не подтвердил что делает так с таблицами: Вставка->Врезка->Фрейм. Это может работать, но LO, боюсь, требует действовать как-то более однозначно или более "популярно". Фрейм - особый объект для "расталкивающей" верстки, а не для размещения динамического контента с переменным содержимым и размерами. Ищите другой способ.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

Цитата: rami от  5 ноября 2018, 13:29
В первом посте вы выложили документ FomCOL.odt в нём есть внедрённая таблица, а под ней гиперссылка. Или вы говорите о каком-то другом документе нам не известном?
Возможно мы друг друга не поняли. Если вы имели ввиду эту гиперссылку - "private:factory/scalc" то я её вообще не рассматриваю. Я её никогда не нажимал и не рассматривал.
А в свойствах самого фрейма-врезки есть вкладка - "гиперссылка". Именно её я и имел ввиду, что она пуста.

economist именно подобными запросами я и пользуюсь.
Цитата: economist от  5 ноября 2018, 19:36- вот этого быть не должно. С использованием StarBasic - тысячестрочные таблицы во Writer  - формируются из любой базы данных или TXT/CSV-файла - за доли секунды-секунду. Отражение (обновление) во Writer неформатированной таблицы из базы данных (любой), даже без средств Basic, - занимает 1,5 секунды + время выполнения запроса. То есть это в любом случае секунды, а не минуты.
Не знаю как такое вам удаётся, но у меня таблица формируется мучительно долго. Возможно я избрал неправильный путь, вот и ищу другой. Во вложении я выложил один из своих макросов, который формирует и форматирует таблицу. Шаблон таблицы с заголовками и первой строкой стоит фиксировано в форме. А всё остальное записывается в неё, добавляется по строчке, но прописывается ужасно медленно. Видно прописываение каждой ячейки.
Во вложении я выложил скрин результата работы этого макроса. Таблица из 180 строк формировалась у меня - 2 мин.

Кстати, вложенная (из стартпоста) таблица и не предназначена для множественного пользования. В ней должен выводиться результат выполнения запроса к общей БД. Я просто борюсь за скорость доступа к самой БД, ведь если будет много обращений одновременно при длительных формированих результатов на каждом рабочем месте... это не хорошо. БД валится.

Kadet

Цитата: economist от  5 ноября 2018, 19:36вас должно насторожить что никто тут и "там" - не подтвердил что делает так с таблицами: Вставка->Врезка->Фрейм.
Нет. Потому что такой вид вложения появился сравнительно недавно и скорее всего просто ещё не изучен. В частности тот же гуру-Питоньяк далеко не всё описывает. В частности он вообще не описывает возможности Таб-пейдей в диалогах, а их-же в формах - вообще никто не касался. Даже вопрос к автору макроса формирования Таб-пейджа в диалогах ничего не дало. Хотя в описании типа TabPage в Либре упоминается, что она приложима к типу документа Form. Только КАК не описано.
В общем думаю, что просто много ещё в LO белых пятен. И мой вопрос тоже считаю просто изучением подобного "белого пятна". Ибо если есть такой документ, то должен же быть к нему доступ.

mikekaganski

@Kadet:

В принципе, вероятно, Вы правы (по крайней мере, мне так кажется). Я на Вашем месте подготовил бы тестовый файл и отправил в багтрекер ЛО (тесторый файл, как и сообщение в багтрекере, должны быть (а) на английском, и (б) полностью самодостаточны - с макросом, не требовать что-то придумывать самостоятельно). Сообщение нужно сформулировать как "невозможно получить доступ к интерфейсу ХХХ", подразумевая, что такой доступ обязан быть. В сообщении, возможно, будет обсуждение. В худшем случае закроют как WONTFIX с объяснением. А возможно, и поправят.
С уважением,
Михаил Каганский

economist

Цитата: Kadet от  6 ноября 2018, 17:53Шаблон таблицы с заголовками и первой строкой стоит фиксировано в форме. А всё остальное записывается в неё, добавляется по строчке, но прописывается ужасно медленно. Видно прописываение каждой ячейки.

А если ускорить макрос командами заморозки Интерефеса? Такими:


ThisComponent.LockControllers
ThisComponent.enableAutomaticCalculation(False)

' тут основной код

ThisComponent.UnLockControllers
ThisComponent.enableAutomaticCalculation(True)
ThisComponent.Calculate


Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Kadet

Цитата: economist от  7 ноября 2018, 15:02А если ускорить макрос командами заморозки Интерефеса? Такими:
Вот за это спасибо. Честно хотел поставить заморозку глубоко в этом направлении не копал.
Спасибо за готовый код. На крайний случай, типа версия - 1.0 БД, вполне сгодится. Думаю это ускорит процедуру.
Попробую.

mikekaganski спасибо за совет. Нужно будет попробовать. Однако с английским беда (только с гугл-переводом). Однако - может и получится.