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

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

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

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Существует ли простой способ узнать количество страниц?  (Прочитано 2236 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Rafik
Форумчанин
***
Offline Offline

Сообщений: 88


« Стартовое сообщение: 6 Апрель 2016, 14:24 »

Не могу найти простой и безотказный способ получения количества страниц.
Пришлось сделать такой макрос:
Код:
Function GetEndAdr(oSheet As object)
' oSheet - Ссылка на лист
oCursor = oSheet.createCursor
oCursor.GotoEndOfUsedArea(false)
nEndRow = oCursor.RangeAddress.EndRow
nEndCol = oCursor.RangeAddress.EndColumn
GetEndAdr = Array(nEndCol,nEndRow) ' Возвращаем адрес последней ячейки документа
end Function

Function Pages1(Optional oDoc As object) As Long
' Считает количество страниц в активном листе.
If isMissing(oDoc) Then
oDoc = ThisComponent
End if
oSheet = oDoc.CurrentController.getActiveSheet()
' Получаем расположение разрывов страницы по колонкам и строкам
oColPgBr = oSheet.getColumnPageBreaks()
oRowPgBr = oSheet.getRowPageBreaks()
' Адрес последней ячейки
oEndAdr = GetEndAdr(oSheet)
'--- Сколько каких разрывов страниц попадает в диапазон (0,0,последн_колонка,последн_строка)
nVert = 0 ' Вертикальные
nHor = 0 ' Горизонтальные
ii = 0
' Позиция первого разрыва. Приводим номер колонки к индексу
nPos1 = oColPgBr(ii).Position - 1
' Сколько вертикальных вписывается ВНУТРЬ диапазона
Do While nPos1 < oEndAdr(0)
nVert = nVert + 1
ii = ii + 1
nPos1 = oColPgBr(ii).Position - 1
Loop
ii = 0
' Позиция первого разрыва. Приводим номер строки к индексу
nPos1 = oRowPgBr(ii).Position - 1
' Сколько горизонтальных вписывается ВНУТРЬ диапазона
Do While nPos1 < oEndAdr(1)
nHor = nHor + 1
ii = ii + 1
nPos1 = oRowPgBr(ii).Position - 1
Loop 
'--- Подсчитали, теперь высчитаем количество страниц
If nVert= 0 And nHor = 0 Then
' Если нет ВНУТРИ разрывов - одна страница
Pages1 = 1
ElseIf nVert > 0 And nHor = 0 Then
' Только вертикальные
Pages1 = nVert + 1
ElseIf nVert = 0 And nHor > 0 Then
' Только горизонтальные
Pages1 = nHor + 1
ElseIf nVert > 0 And nHor > 0 Then
' есть и те и другие
Pages1 = (nHor+1)*(nVert + 1)
End If
End Function
Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 6 Апрель 2016, 18:38 »

Простой способ узнать количество страниц — посмотреть в свойствах документа статистику, но если нужно рассчитать, то проще всего так:
Код:
Function nPages
oSheet=ThisComponent.CurrentController.ActiveSheet
oColPgBr=oSheet.ColumnPageBreaks
oRowPgBr=oSheet.RowPageBreaks
nPages=(UBound(oColPgBr)+1)*(UBound(oRowPgBr)+1)
End Function
Записан

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

Сообщений: 88


« Ответ #2: 7 Апрель 2016, 07:27 »

rami, в версии 4.2.2 показывает умопомрачительное количество страниц = 1805688, хотя в диапазоне печати всего лишь 2 страницы. Я начал писать свой макрос ласипед именно с такой краткой процедуры.

За формулу пересчета на листы огромное спасибо. Цепочку "если" можно будет заменить формулой. Вот что получилось в итоге
Код:
Function Pages1(Optional oDoc As object) As Long
' Считает количество страниц в активном листе.
If isMissing(oDoc) Then
oDoc = ThisComponent
End if
oSheet = oDoc.CurrentController.getActiveSheet()
' Получаем расположение разрывов страницы по колонкам и строкам
oColPgBr = oSheet.getColumnPageBreaks()
oRowPgBr = oSheet.getRowPageBreaks()
' Адрес последней ячейки
oEndAdr = GetEndAdr(oSheet)
'--- Сколько каких разрывов страниц попадает в диапазон (0,0,последн_колонка,последн_строка)
nVert = 0 ' Вертикальные
nHor = 0 ' Горизонтальные
' Сколько вертикальных вписывается ВНУТРЬ диапазона
Do While oColPgBr(nVert).Position - 1 < oEndAdr(0)
nVert = nVert + 1
Loop
' Сколько горизонтальных вписывается ВНУТРЬ диапазона
Do While oRowPgBr(nHor).Position - 1 < oEndAdr(1)
nHor = nHor + 1
Loop  
'--- Подсчитали, теперь высчитаем количество страниц и вернем его
Pages1 = (nHor+1)*(nVert + 1)
End Function

В моем ласипеде есть неточность. Если конец документа <> концу диапазона печати, будет неправильное количество страниц. Поэтому надо будет в GetEndAdr определять координаты последней ячейки для PrintArea, а не для листа.
« Последнее редактирование: 7 Апрель 2016, 07:38 от Rafik » Записан
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 7 Апрель 2016, 13:21 »

в версии 4.2.2 показывает умопомрачительное количество страниц = 1805688, хотя в диапазоне печати всего лишь 2 страницы.
В разных условиях результат получается разный, а для чего это нужно? Может быть зная более подробные условия и для каких целей нужно количество печатных листов, удасться "подогнать" решение.

В свойствах документа эти данные есть и для свойств они вычисляются правильно, но при попытке доступа через макрос они выдают "0" (ноль), кажется разработчики что-то не "привинтили".
Записан

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

Сообщений: 88


« Ответ #4: 7 Апрель 2016, 15:46 »

Ежемесячно некая программа рожает отчеты в формате *.xls и некоторые документы (обычно 4-8) надо напечатать не полностью, а только первый и последний (или предпоследний+последний) лист. Лень открывать каждый из этих документов, переключаться в режим разметки, идти в хвост, смотреть что попадает на последнюю страницу, руками запускать печать.
Можно с помощью макросов выловить эти отчеты по названию файла из папки с отчетами. Можно определить сколько страниц. Можно определить, по содержимому первой строки на последней странице, что на последней странице: только подписи или попала часть таблицы со сведениями. Исходя из содержимого первой строки последней страницы можно решить какие листы печатать: только последний или предпоследний+последний.
Черновой вариант такого ласипеда уже сделал.
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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