копирование и вставка нескольких строк за раз

Автор Михаил53, 18 ноября 2023, 12:53

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

Михаил53

Работаю с OpenOffice через макросы.
Есть данные в строке, необходимо их вставить нужное количество раз со сдвигом ячеек вниз.
Сейчас я вставляю пустые строки за раз, а затем в цикле заполняю их скопированными данными, если данных очень много 10-15тыс строк то это очень медленно, можно ли за раз скопировать и вставить строку нужное кол-во раз со сдвигом ячеек ?

economist

Вариантов ускорения очень много, особенно если неизвестно что тормозит. Допустим, вы вставляете строки по дата-время.

Пара моментов для проверки в 1-ю очередь:

1) блокировать при вставке перерисовку экрана макросом (два метода, ускорение 5-10Х);

2) использовать getDataArray, добавить строки в массив (сортировка?) и через setDataArray                                                      вернуть на лист (примеры на оба момента на Форуме есть).

Архитектурно вставка в 15k строк еще 5k строк вразнобой с сортировкой - уже не шутки. Но это легкая задача для БД и языка SQL. При использовании, например SQLite c драйвером JDBC - скорость вставки будет в 4 раза выше, чем макросом. К тому же с БД SQlite можно работать по сети 3-5 человечкам (как с MS Access).

Еще быстрее будет вставка в SQLite макросом на Python. И еще быстрее - операции в RAM на Python c Pandas. Примеры тоже есть на Форуме.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Выгрузите файл c сотней строк и описанием требуемых действий. Тогда можно будет подобрать оптимальный вариант.
Владимир.

Михаил53

Цитата: sokol92 от 18 ноября 2023, 16:27Выгрузите файл c сотней строк и описанием требуемых действий. Тогда можно будет подобрать оптимальный вариант.

Файл простой, есть табличный документ, шапка/подвал и строка шаблона табличных данных. Я использую OLE для выгрузки из своей программы данных. Каждая строка таблицы идентична шаблону и содержит статические, динамические данные и форматирование. Перед выгрузкой данных, нужно подготовить табличную часть создав столько строк, сколько нужно и заполнить их шаблоном. Как я писал выше сначала вставляю за раз пустые строки что бы не затереть подвал документа, затем заполняю эти строки шаблонной строкой в цикле. Вот хотелось бы как то без цикла обойтись...

Цитата: economist от 18 ноября 2023, 14:031) блокировать при вставке перерисовку экрана макросом (два метода, ускорение 5-10Х);
это делается

Цитата: economist от 18 ноября 2023, 14:032) использовать getDataArray, добавить строки в массив (сортировка?) и через setDataArrayвернуть на лист (примеры на оба момента на Форуме есть).

Это интересное решение, но как я понял оно не позволяет сохранить изначальное форматирование шаблонной строки, т.е. потребуется пройтись по всем строкам и задать нужное форматирование каждой ячейки ? Если это так то сомневаюсь в ускорении процесса на большом объеме...

economist

На вставках по 15k строк любые грезы о форматировании разбиваются о скорость. Могу лишь предложить настроить форматы с избытком на пустые строки, дальше setDataArray для вставки данных и скрыть пустое. Подвал также можно вставлять заново кодом.   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Михаил53

#5
В целом задача была решена через uno.GoToCell и uno.InsertContents
все работает быстро, как нужно !