Как перенести данные в другой документ?

Автор eeigor, 16 февраля 2023, 11:02

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

eeigor

Впервые работаю с интерфейсом XTransferableSupplier. Мне не ндравятся ограничения метода, или я не разобрался...
Работает, но если только в источнике 1) диапазон выделен, 2) диапазон непрерывен (у меня то, что надо перенести, сначала фильтруется в источнике данных), иначе объект Transferable будет NULL.
Отсюда я должен перед фильтрацией и выделением прежде отсортировать данные по требуемому полю (чтобы выделяемый фрагмент был непрерывным, иначе появляются разрывы из-за скрытых фильтром строк). Третье условие: 3) документы видимы, то есть отображаются. Дело в том, что создать документов надо много и перенести в каждый порцию данных. Значит, создавать их без отображения ("по-тихому"), может даже в одном и том же фрейме*, точно не получится, так?

* В одном фрейме, которому я сам присваиваю имя и в дальнейшем использую именного его при создании новых документов (новый замещает старый) – вместо _default или _blank.

Действительно так?

Альтернатива: select visible (queryVisibleCells) и перенести данные в цикле. Разрывы допускаются (можно не фильтровать). Отображение создаваемого документа не требуется (создал, перенёс данные, сохранил, закрыл). Но в цикле, а не одним махом. Что же будет эффективнее?

Какие будут соображения на сей счёт?


UPD. При этом переносится форматирование. Мне это не нужно. Как перенести данные без форматирования? Через диспетчер специальной вставкой?

Справочно:
https://forumooo.ru/index.php?topic=8452.msg56880#msg56880
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Мы используем специальную вставку ячеек (через "Диспетчер"). Пока в UNO аналога нет.

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

Если нужно перенести только значения и формулы, то можно попробовать getFormulaArray/setFormulaArray.
Владимир.

eeigor

#2
В конечном итоге был принят следующий вариант. В цикле:
1. Фильтруем данные (oRange.filter).
2. Получаем видимые записи (oRange.queryVisibleCells).
3. Переносим в новый документ данные каждого диапазона в семействе oRanges за один раз методами get/setDataArray(). При этом форматирование не переносится, как и требовалось.
Предварительно в целевом документе в таблицу добавляется требуемое количество пустых строк с копированием форматов и формул из вышележащей строки (используется метод oScript.invoke – спасибо Владимиру за помощь). Целевой документ "знает" как добавлять строки.
4. Удаляем последний фильтр.

Альтернатива: методы диспетчера, через специальную вставку (select – copy – paste с вариациями).

UPD. Фильтруя данные с остановкой в режиме отладки, вижу, что Автофильтр показывает чёрт-те что: флажки выбора пунктов не синхронизированы, а команда "Clear Filter" в окне Автофильра отсутствует при наложенном фильтре, номера видимых строк должны быть синими – этого тоже нет. При этом регулярные выражения не используются (иначе Автофильтр вообще начинает "жить своей жизнью"). Но это "старая песня", от которой я ужо заметно устал. :(  Предпочитаю пользоваться расширенным фильтром, а пользователю вывожу предупреждение: Автофильтр не включать! Так как фильтрация макросом работает верно, но появляется рассогласование с тем, что видит пользователь в окне Автофильтра. Вопрос синхронизации для меня не решён.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community