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

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

19 Ноябрь 2018, 14:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Доступ к OLE-таблице внедрённую во Writer (Embed)  (Прочитано 1308 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kadet
Участник
**
Offline Offline

Сообщений: 17


« Стартовое сообщение: 2 Ноябрь 2018, 21:42 »

Добрый день!
Нигде не смог найти ответ на этот вопрос.
В 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.

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

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

* FomCOL.odt (13.33 Кб - загружено 8 раз.)
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 3 Ноябрь 2018, 17:53 »

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

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

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


* ОбъектOLE.png (28.14 Кб, 417x242 - просмотрено 3 раз.)
Записан

Kadet
Участник
**
Offline Offline

Сообщений: 17


« Ответ #2: 3 Ноябрь 2018, 20:27 »

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

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

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

Сообщений: 965


« Ответ #3: 4 Ноябрь 2018, 00:30 »

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

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

Сообщений: 17


« Ответ #4: 4 Ноябрь 2018, 10:38 »

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

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

* 2.ods (41.42 Кб - загружено 4 раз.)
« Последнее редактирование: 4 Ноябрь 2018, 13:25 от Kadet » Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #5: 4 Ноябрь 2018, 14:46 »

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

Kadet
Участник
**
Offline Offline

Сообщений: 17


« Ответ #6: 5 Ноябрь 2018, 10:19 »

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

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 5 Ноябрь 2018, 13:29 »

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

economist
Форумчанин
***
Offline Offline

Сообщений: 965


« Ответ #8: 5 Ноябрь 2018, 21:11 »

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

Звучит адово для внедренца (если это онлайн-таблица заказа). Необходимо всё-таки разграничить интерфейсы продажника, аналитика, бухгалтера итп. А еще -  я почти уверен что "доступ к этой таблице внутри этого фрейма через макрос" во 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, если есть конкретное поле для группировки - проще.
« Последнее редактирование: 5 Ноябрь 2018, 21:15 от economist » Записан

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

Сообщений: 965


« Ответ #9: 5 Ноябрь 2018, 21:36 »

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

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

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

Сообщений: 17


« Ответ #10: 6 Ноябрь 2018, 19:53 »

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

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

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

* 222.txt (16.98 Кб - загружено 5 раз.)

* 333.jpg (612.13 Кб, 1280x1024 - просмотрено 6 раз.)
Записан
Kadet
Участник
**
Offline Offline

Сообщений: 17


« Ответ #11: 6 Ноябрь 2018, 20:01 »

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 110


« Ответ #12: 7 Ноябрь 2018, 09:29 »

@Kadet:

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

С уважением,
Михаил Каганский
economist
Форумчанин
***
Offline Offline

Сообщений: 965


« Ответ #13: 7 Ноябрь 2018, 17:02 »

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

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

Код:
ThisComponent.LockControllers
ThisComponent.enableAutomaticCalculation(False)

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

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

 
Записан

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

Сообщений: 17


« Ответ #14: 7 Ноябрь 2018, 17:12 »

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

mikekaganski спасибо за совет. Нужно будет попробовать. Однако с английским беда (только с гугл-переводом). Однако - может и получится.
Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

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