Программное удаление строк в OOo Calc

Автор ost, 20 января 2017, 12:06

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

ost

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

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

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

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

JohnSUN

Есть, как не естьбыть.
С помощью .getDataArray считать лист в массив, в цикле переписать нужные (не попадающие в массив исключений) строки в новый, вспомогательный массив и или очистить лист и вписать новый массив на старое место, или создать пустой лист и шарахнуть новый массив с помощью .setDataArray туда
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

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


For Each с in Range()
c.AddComment
Next

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


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

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

ost

#3
Цитата: JohnSUN от 20 января 2017, 10:14...С помощью .getDataArray

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

Тут вот еще какое дело.
При использовании getDataArray и последующем setDataArray в новый лист постоянно докучает тот факт, что форматы не копируются. =( Можно ли как то "оптом" скопировать форматы из source-диапазона на одном листе в target-диапазон - на другом?

ost


JohnSUN

Цитата: ost от 20 января 2017, 16:58
форматы не копируются. =( Можно ли как то "оптом" скопировать форматы из source-диапазона на одном листе в target-диапазон - на другом?
Я бы скопировал весь исходный лист с помощью oSheets.copyByName и вычистил бы через .clearContents(511) - в смысле, убрал всё, кроме форматов
Почему-то мне кажется, что сделать это "одним махом" проще и быстрее, чем отлавливать и копировать исходные форматы по одному
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ost

Цитата: JohnSUN от 20 января 2017, 16:56Я бы скопировал весь исходный лист с помощью oSheets.copyByName
А можно ли так же просто скопировать лист из одной книги в другую?

rami

Можно:
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

Цитата: rami от 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

Шикарно! Спасибо.
Мегарешпект и уважуха!