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

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

11 Август 2022, 02:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Скопировать диапазон ячеек вместе с форматированием [РЕШЕНО]  (Прочитано 7610 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mikekaganski
Гуру
*******
Offline Offline

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


« Ответ #15: 19 Май 2022, 13:33 »

да почему в этот же?
Да потому что Вы не указываете функции copyRange, что исходные данные для копирования находятся в какой-то другой книге. И не можете, потому что источник в эту функцию передаётся в форме com::sun::star::table::CellRangeAddress, который вы получаете с помощью getRangeAddress. А там указаны: номер листа, строки и столбцы начала и конца. И ни слова о книге.
Записан

С уважением,
Михаил Каганский
sokol92
Мастер
*****
Offline Offline

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


WWW
« Ответ #16: 19 Май 2022, 13:40 »

Тогда придется сперва лист шаблона копировать, а потом из него диапазон шаблона брать через copyRange

Либо использовать "по старинке" буфер обмена.
Записан

Владимир.
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #17: 19 Май 2022, 13:46 »

Мои знания на уровне увидеть подобное и переделать под свои цели. Так глубоко смотреть знаний не хватает.
Вот к примеру начал переделывать процедуру, чтобы второй лист копировала в oDoc1 и опять не выходит.

Код:
Sub One_sheet_to_XLS()   ' копирование листа в новый документ
Dim oSheets1,oDesk,aFnm As Object ' Документ куда тащим лист и его листы
Dim oSheet As Object ' Документ откуда тащим и интересующий лист
Dim ii as integer

' ==== Перетаскиваем интересующий лист из текущего документа
' oDoc = ThisComponent 'Документ откуда = текущий документ, Уже в константах определено
oSheet = oDoc.Sheets("Лист2") ' лист "Лист2" документа
Set oDesk = createUnoService("com.sun.star.frame.Desktop") ' Открываем пустой документ для импорта, это будет временный файл
    oDoc1 = oDesk.LoadComponentFromUrl("private:factory/scalc", "_blank", 63, Array())
oSheets1 = oDoc1.getSheets() ' Импорт листа в пустой документ (временный файл)
oSheets1.importSheet(oDoc,oSheet.LinkDisplayName,0)
For ii = 1 To oDoc1.Sheets.Count -1     ' Удаляем ненужные листы в новом документе
oDoc1.Sheets.removeByName(oDoc1.Sheets(ii).Name)
Next

oSheet = oDoc.Sheets("Шаблон") ' лист "Шаблон" документа
oSheets1 = oDoc1.getSheets() ' Импорт листа в пустой документ (временный файл)
oSheets1.importSheet(oDoc,oSheet.LinkDisplayName ,1)
End Sub

Вставляет повторно тот же Лист2, хотя надо "Шаблон"
Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #18: 19 Май 2022, 14:15 »

 
oSheet = oDoc.Sheets("Лист2")
а так можно было Улыбка Я для задания листа по имени знаю
Код:
oSheet = oDoc.Sheets.getByName("Лист2")
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Опытный пользователь
***
Online Online

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


« Ответ #19: 19 Май 2022, 14:39 »

а так можно было  Я для задания листа по имени знаю
Код:
    oSheet = oDoc.Sheets.getByName("Лист2")
С индексом можно и покороче: вместо
    .Sheets.getByIndex(1) -> .Sheets(1)
Но .Sheets("Sheet2") -> вернёт ссылку не на второй лист, а на первый всегда (вероятно, баг: работает только с первым листом). Поэтому
    .Sheets.getByName("Sheet2")

Edit:
Я противник геттеров и сеттеров. Без них код чище. Но с ними перенос между платформами проще.
« Последнее редактирование: 19 Май 2022, 14:43 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community
mikekaganski
Гуру
*******
Offline Offline

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


« Ответ #20: 19 Май 2022, 15:14 »

.Sheets("Sheet2") -> вернёт ссылку не на второй лист, а на первый всегда

Потому что CLng("Sheet2") возвращает 0, который и используется в getByIndex.
Записан

С уважением,
Михаил Каганский
kompilainenn
Мастер
*****
Offline Offline

Сообщений: 3 470



« Ответ #21: 19 Май 2022, 15:22 »

Я противник геттеров и сеттеров. Без них код чище.
И непонятнее
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
sokol92
Мастер
*****
Offline Offline

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


WWW
« Ответ #22: 19 Май 2022, 15:32 »

CLng("Sheet2") возвращает 0
И это странно, а при наличии опции
Код:
Option VBASupport 1
очевидно, является ошибкой.

Пишем баг?

Из описания CLng: To convert a string expression, the number must be entered as normal text ("123.5") using the default number format of your operating system.

Для справки: В VBA только функция Val вернет 0 для указанного аргумента. Все остальные функции преобразования в числовой тип являются локализованными и при невозможности преобразования текста в число вызывают ошибочную ситуацию.

Проверил LO Basic CDbl - поведение соответствует VBA.
« Последнее редактирование: 19 Май 2022, 17:33 от sokol92 » Записан

Владимир.
eeigor
Опытный пользователь
***
Online Online

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


« Ответ #23: 19 Май 2022, 15:57 »

Потому что CLng("Sheet2") возвращает 0, который и используется в getByIndex.
В Excel это тип Variant: число - по индексу, строка - по имени.

КМК, правильно - это в зависимости от типа данных аргумента вызывать или getByIndex, или getByName. Как в Excel. Куда проще...
« Последнее редактирование: 19 Май 2022, 16:03 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community
sokol92
Мастер
*****
Offline Offline

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


WWW
« Ответ #24: 19 Май 2022, 20:35 »

Либо использовать "по старинке" буфер обмена.
Упустил из виду getTransferable. Название темы практически такое же.
Такой подход имеет высокое быстродействие, не требуется копировать лист целиком, буфер обмена не изменяется.
« Последнее редактирование: 19 Май 2022, 20:39 от sokol92 » Записан

Владимир.
siti
Форумчанин
***
Offline Offline

Сообщений: 54


« Ответ #25: 20 Май 2022, 09:19 »

Упустил из виду getTransferable. Название темы практически такое же.
Такой подход имеет высокое быстродействие, не требуется копировать лист целиком, буфер обмена не изменяется.
Супер! Так как я так и не победил перенос второго листа, то getTransferable решило мою задачу при копировании диапазона. Спасибо.

Код из книги, если кому лень искать будет

Код:
 Dim o
  Dim oSheet
  Dim oRange
  Dim oDoc

  oRange = oDoc1.Sheets(0).getCellRangeByName("B2:C3")
  oDoc1.CurrentController.select(oRange)
  o = oDoc1.CurrentController.getTransferable()
  
  oRange = oDoc2.Sheets(0).getCellRangeByName("F1")
  oDoc2.CurrentController.select(oRange)
  oDoc2.CurrentController.insertTransferable(o)
Только я не понял, почему автор описывает переменную oDoc, которую не использует, а в тексте у него oDoc1 и oDoc2
« Последнее редактирование: 20 Май 2022, 09:23 от siti » Записан
Страниц: « 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!