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

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

21 Сентябрь 2019, 02:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Программное удаление строк в OOo Calc  (Прочитано 2614 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ost
Форумчанин
***
Offline Offline

Сообщений: 108


« Стартовое сообщение: 20 Январь 2017, 12:06 »

Доброго.
Есть таблица OOo Calc, содержащая строки-записи.
Есть программно сформированный одномерный массив с номерами строк . Он не сортирован.

Подскажите, пожалуйста, корректный и желательно быстрый способ программного удаления тех строк таблицы, номера которых содержит массив. Назовем их "Ненужными". =)

Проблема:
Программное удаление первой же строки ведет к изменению их нумерации и, соответственно, утрате актуальности всей информации в массиве: номера строк в массиве перестают соответствовать номерам строк таблицы, что приводит к удалению "Нужных" строк и неудалению "Ненужных". О_О

Способ решения, который приходит в голову: отсортировать массив и начать удаление строк со строки с наибольшим номером.
Сильное ощущение, что есть другой более красивый способ. Есть же?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 20 Январь 2017, 12:14 »

Есть, как не естьбыть.
С помощью .getDataArray считать лист в массив, в цикле переписать нужные (не попадающие в массив исключений) строки в новый, вспомогательный массив и или очистить лист и вписать новый массив на старое место, или создать пустой лист и шарахнуть новый массив с помощью .setDataArray туда
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
economist
Форумчанин
***
Offline Offline

Сообщений: 984


« Ответ #2: 20 Январь 2017, 16:26 »

Чисто ради пятничного разговора.
В MS Excel (кто бы мог подумать!) - самый
быстрый способ удаления строк - это добавить к ячейкам комментарий, скажем в цикл, а потом...  

Код:
For Each с in Range()
c.AddComment
Next

' а затем удаляем
Rows("1:65535").SpecialCells(xlCellTypeComments).EntireRow.Delete    

Excel при этом берет на себя все заботы по упорядочению массива. Аналогичного в OpenOffice|LibreOffice StarBasic не нашел. Но удалять надо 100% идя снизу-вверх.

« Последнее редактирование: 20 Январь 2017, 16:34 от economist » Записан

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

Сообщений: 108


« Ответ #3: 20 Январь 2017, 16:58 »

...С помощью .getDataArray

=) Всемогущий getDataArray с братом setDataArray!
Спасибо.

Тут вот еще какое дело.
При использовании getDataArray и последующем setDataArray в новый лист постоянно докучает тот факт, что форматы не копируются. =( Можно ли как то "оптом" скопировать форматы из source-диапазона на одном листе в target-диапазон - на другом?
« Последнее редактирование: 20 Январь 2017, 17:49 от ost » Записан
ost
Форумчанин
***
Offline Offline

Сообщений: 108


« Ответ #4: 20 Январь 2017, 17:01 »

=) Попробую на будущей неделе.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #5: 20 Январь 2017, 18:56 »

форматы не копируются. =( Можно ли как то "оптом" скопировать форматы из source-диапазона на одном листе в target-диапазон - на другом?
Я бы скопировал весь исходный лист с помощью oSheets.copyByName и вычистил бы через .clearContents(511) - в смысле, убрал всё, кроме форматов
Почему-то мне кажется, что сделать это "одним махом" проще и быстрее, чем отлавливать и копировать исходные форматы по одному
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ost
Форумчанин
***
Offline Offline

Сообщений: 108


« Ответ #6: 23 Январь 2017, 08:04 »

Я бы скопировал весь исходный лист с помощью oSheets.copyByName
А можно ли так же просто скопировать лист из одной книги в другую?
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 23 Январь 2017, 09:47 »

Можно:
Код:
Sub Main
oUrl="file:///Путь/к/документу/Документ.ods"   'адрес копируемого документа
oSheet=ThisComponent.Sheets(0)   'куда вставляем
sSheet="Лист1"   'имя копируемого листа
oSheet.link(oURL,sSheet,"","",com.sun.star.sheet.SheetLinkMode.NORMAL)  'вставка
oSheet.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)   'удаление связи
End Sub
Записан

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

Сообщений: 108


« Ответ #8: 27 Январь 2017, 21:00 »

Можно:
Код:
Sub Main
oUrl="file:///Путь/к/документу/Документ.ods"   'адрес копируемого документа
oSheet=ThisComponent.Sheets(0)   'куда вставляем
sSheet="Лист1"   'имя копируемого листа
oSheet.link(oURL,sSheet,"","",com.sun.star.sheet.SheetLinkMode.NORMAL)  'вставка
oSheet.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)   'удаление связи
End Sub
Шикарно! Спасибо.
Мегарешпект и уважуха!
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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