Печать листов с указанными именами.

Автор DigitaLS, 23 марта 2023, 11:43

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

DigitaLS

Добрый день Друзья!
Прошу показать рабочий код для печати страниц с разными именами.
Перепробовал кучу вариантов с этого форума, а так же из интернет, ничего не работает :( что то работает, но не так.

Суть в том, что есть несколько страниц (Sheets), которые нужно напечатать подряд,
то есть: на одной стороне листа - страница Sheet1, на второй стороне этого же листа страница Sheet2 и т.д.
другими словами печать массива страниц Sheet1,Sheet2,Sheet3,....





economist

Рассмотрите в кач-ве альтернативы более простой путь: экспорт нужных листов в PDF (макрос записывается макрорекордером, есть примеры на Форуме) и дальше просто печатаем весь PDF.

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

DigitaLS

#2
economist, благодарю за рекомендацию, посмотрю.
Мне не принципиальна двусторонняя печать автоматом.
Можно сделать так, что бы появлялось окно настроек принтера.

p.s. Пробовал "Макрорекордер", он к сожалению выделяет и печатает листы последовательно.

DigitaLS

#3
Можно было бы сделать на основе такого кода:
Sub selectSheets()
   Dim oDoc As Object
   Dim oSheet1 As Object
   Dim oSheet2 As Object
   Dim oSheet3 As Object

   oDoc = ThisComponent
   oSheet1 = oDoc.Sheets.getByName("Sheet1")
   oSheet2 = oDoc.Sheets.getByName("Sheet2")
   oSheet3 = oDoc.Sheets.getByName("Sheet3")
   ThisComponent.getCurrentController().select(Array(oSheet1, oSheet2, oSheet3))
End Sub
Он выполняется без ошибок, но страницы не выделяет

Вот ещё так можно сделать, тут каждый лист выделяется, но по отдельности, а нужно вместе (на подобии команды SelectAll)
Sub selectSheets()
   Dim oDoc As Object
   Dim oSheets As Object
   Dim oSheet1 As Object
   Dim oSheet2 As Object
   Dim oSheet3 As Object

   oDoc = ThisComponent
   oSheet1 = oSheets.getByName("Sheet1")
   oSheet2 = oSheets.getByName("Sheet2")
   oSheet3 = oSheets.getByName("Sheet3")

oDoc.CurrentController.setActiveSheet(oSheet1)
oDoc.CurrentController.select(oSheet2)
oDoc.CurrentController.select(oSheet3)
End Sub

mikekaganski

С уважением,
Михаил Каганский

DigitaLS

#5
Всё
Цитата: mikekaganski от 24 марта 2023, 12:17https://ask.libreoffice.org/t/select-multiple-sheets-tabs-via-macro/76610/4

Всё получилось, Спасибо! Только пришлось поправить код.
(за все дни старательных поисков решения, начал немного понимать ошибки в коде)

Sub TestSel
Dim aSel(0) as new com.sun.star.beans.PropertyValue

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

SheetIndex1 = ThisComponent.Sheets.getByName("Лист1").RangeAddress.Sheet 'определяем индекс "Лист1"
SheetIndex2 = ThisComponent.Sheets.getByName("Лист2").RangeAddress.Sheet 'определяем индекс "Лист2"
SheetIndex3 = ThisComponent.Sheets.getByName("Лист3").RangeAddress.Sheet 'определяем индекс "Лист3"

With dispatcher
    aSel(0).Name="Tables"
    aSel(0).Value=Array(SheetIndex1, SheetIndex2, SheetIndex3)
    dispatcher.executeDispatch(document, ".uno:SelectTables", "", 0, aSel)' тут само выделение
    dispatcher.executeDispatch(document, ".uno:Print", "", 0, aSel)' тут печать
 End With 
End Sub

economist

Макрорекордер создает рабочий код по выделению всех Листов. Если кажется что не все выделено - это только кажется (есть проблемы с обновлением экрана).

sub SelectAllSheets
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:TableSelectAll", "", 0, Array())
end sub

А дальше жмем Ctrl+P - отправятся на печать только выделенные Листы на принтер, которые и создадут многостраничный документ (на неск. листах А4).

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

DigitaLS

Цитата: economist от 24 марта 2023, 13:25Если нужно печатать не все, а некоторые листы - ненужные перед запуском макроса нужно скрыть. Опять же, скрытие листов записывается макро-рекордером.
Всё верно, но я не знаю какие листы будут у меня открыты, а какие нет, потому, к сожалению не могу применять SeletAll.
Кстати попробовал упростить код, оставив только названия листов, но чего то не хватает, программа не работает:
.....
With dispatcher
    aSel(0).Name="aTableName"
    aSel(0).Value=Array("Лист1", "Лист2", "Лист3")
....

bigor

Цитата: DigitaLS от 24 марта 2023, 13:35оставив только названия листов
что то я сомневаюсь, что для названия листов имя нужно "aTableName" Кстати изменил на "TableName" начал вылазить запрос на выбор листов
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

sokol92

Описание uno команд здесь.
Команда .uno:SelectTables имеет один аргумент с именем Tables, значение которого должно быть массивом целых (integer) чисел (индексы листов документа Calc).

Переход от массива имен листов к массиву индексов не сложен:
Dim arr, i As Long
 arr=Array("sw", "sc", "sd")
 For i=0 To Ubound(arr)
   arr(i)=ThisComponent.Sheets.getByName(arr(i)).RangeAddress.Sheet
 Next i 
Владимир.

DigitaLS

спасибо sokol92, к сожалению не догоняю как всё будет выглядеть в контексте.

economist

Ветка с XY-проблемой. Решали одну проблему, но она оказалась другой. Что вообще надо? Не замалчивайте контекст - есть куча способов достигнуть цель. И ни одного - достигнуть неизвестную цель.

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

sokol92

Цитата: DigitaLS от 27 марта 2023, 06:26как всё будет выглядеть в контексте.
Так контекст Ваш.  :)
В #5 Вы приводите пример работающего кода, в котором используются индексы (номера) листов.
В #7 Вы хотите обработать массив имен листов, но команда .uno:SelectTables требует параметр "Tables", содержащий массив индексов, а не массив имен. Код из #9 иллюстрирует, как от массива имен перейти к массиву индексов.
Мы можете этот фрагмент добавить в #5 и далее:
With dispatcher
    aSel(0).Name="Tables"
    aSel(0).Value=arr
    ' ...
Владимир.