CftClub.ru
Клуб специалистов ЦФТ-Банк

Печать в EXCEL. Многостраничный отчет.

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
dvt
Участник со стажем
Неподтвержденный


Вступление в Клуб: 22.10.2012
СообщениеПт Фев 08, 2013 14:56   Печать в EXCEL. Многостраничный отчет. Ответить с цитатой
Полезность: Нет оценки
Ситуация, наверное классическая, но... смешно Sad, но я впервые с этим столкнулся в таком виде. Никто из коллег не знает как решить проблему. Суть проблемы: есть отчет. У него есть шапка (содержит вычисляемые значения), есть таблица отчета (название колонок + некоторое количество строк содержимого), есть подвал (подписи и т.п.). Все это формируется на базе шаблона (туда я вынес исключительно заголовок таблицы, т.к. все остальное вычисляется). В шаблоне для строки с заголовком таблицы указал в "Печать на каждой странице. Сквозные строки." Все замечательно, за исключением ситуации, когда на последнюю страницу не влезает совсем чуть-чуть - часть или весь подвал (подписи и т.п.). В таком случае на последней странице получаю заголовок таблицы и сразу после него подписи. Решение напрашивается - ставить после предпоследней строки таблицы принудительный разрыв страницы функцией EXCEL.PutPageBreak( row ). Вот только как узнать, что подвал отчета не помещается на последнюю страницу? Высота строк в таблице может быть разной (стоит перенос слов и автоподбор высоты). Соответственно тупо считать по заранее известным значениям не получиться (раньше такой вариант у меня проходил - везло с отчетами). Установка высоты строки в библиотеке есть, а получение высоты строки нет. Smile.

Буду признателен за подсказку.

Может быть есть какой-то другой вариант получения адекватнооформленного отчета... буду тоже признателен.
Alkov
Профи
Неподтвержденный


Вступление в Клуб: 23.09.2010
СообщениеПн Фев 11, 2013 04:59    Ответить с цитатой
Полезность: Нет оценки
>> за исключением ситуации, когда на последнюю страницу не влезает совсем чуть-чуть - часть или весь подвал (подписи и т.п.). В таком случае на последней странице получаю заголовок таблицы и сразу после него подписи.

1. Может какой-н SP для офиса фиксит эту проблему ?
2. Может использовать не сквозные, а колонтитулы ?
3. Можно тупо всегда брать и рвать страницу перед последними одной-двумя(N) строками Smile
dvt
Участник со стажем
Неподтвержденный


Вступление в Клуб: 22.10.2012
СообщениеПн Фев 11, 2013 06:37    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
>> за исключением ситуации, когда на последнюю страницу не влезает совсем чуть-чуть - часть или весь подвал (подписи и т.п.). В таком случае на последней странице получаю заголовок таблицы и сразу после него подписи.

1. Может какой-н SP для офиса фиксит эту проблему ?
2. Может использовать не сквозные, а колонтитулы ?
3. Можно тупо всегда брать и рвать страницу перед последними одной-двумя(N) строками Smile

1. Он может пофиксить только если будет понимать, что из себя предстваляет содержимое файла. Сам по себе он понять не в состоянии, значит надо ему "объяснить". Вопрос как?
2. Колонтитул штука хорошая. Но я не понял как туда вносить данные. Например, пользователь выбирает, кто подписывает отчет, соответсвенно, выбраный должен фигурировать в подписи. Как передать эти данные в колонтитул? Лично я не знаю. Sad Но если кто-то подскажет - буду признателен.
3. Это решает озвученную проблему, но создает другую - если на последней странице 2-3 строки с таблице, то принудительный разрыв перед последнии 1-2 строчками создаст маразм - предпоследняя страница с 1-2 строчками, а за ней последняя с 1-2 строчками.

P.S. Неужели никто с такие проблемы не решал??? Ведь однозначно - классика печати отчета. Sad
Volod
Профи
Неподтвержденный


Вступление в Клуб: 19.09.2007
СообщениеПн Фев 11, 2013 08:44    Ответить с цитатой
Полезность: 3
Цитата:
Колонтитул штука хорошая. Но я не понял как туда вносить данные.


Код:
EXCEL.cmd('Sheet.PageSetup.LeftFooter = "Страница &P из &N"');
dvt
Участник со стажем
Неподтвержденный


Вступление в Клуб: 22.10.2012
СообщениеПн Фев 11, 2013 11:25    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Цитата:
Колонтитул штука хорошая. Но я не понял как туда вносить данные.


Код:
EXCEL.cmd('Sheet.PageSetup.LeftFooter = "Страница &P из &N"');

Спасибо. Учту на будущее.

Проблема в том, что задумавшись о колонтитуле... я упустил, что он печатается на каждой странице. А вот это мне совершенно ненужно. Sad Как это побороть?

Заодно еще один вопрос - можно ли как-то управлять шрифтом в колонтитуле? В смысле: часть левого колонтитула жирная, часть обычная.
Alkov
Профи
Неподтвержденный


Вступление в Клуб: 23.09.2010
СообщениеВт Фев 12, 2013 03:38    Ответить с цитатой
Полезность: Нет оценки
Ну например узнать сколько страниц в документе после его формирования, затем напечатать на одну страницу меньше, потом добавить колонтитул и напечатать последнюю. но это если надо сразу вывести на печать, а не на экран. Если на экран , то думаю нужно перед последней странице добавить разрыв раздела и после этого колонтитул...
dvt
Участник со стажем
Неподтвержденный


Вступление в Клуб: 22.10.2012
СообщениеВт Фев 12, 2013 14:58    Ответить с цитатой
Полезность: 2
В общем, я сделал так: нарисовал макрос в шаблоне и вызвал его из операции. Код вызова из операции:
Код:
EXCEL.cmd('xls.Run "Macros2"');      -- Контрольный выстрел в голову

Макрос честно нашел и содрал подогнав под свои нужды (почему не работал практически аналогичный мой код.... для меня осталось великой экселевской тайной). Код макроса (может кому-то понадобится):
Код:
Sub Macros2()
'
' Macros2 Макрос
'

With ActiveSheet                     'лист с отчетом "для печати"
    If .HPageBreaks.Count > 0 Then
        Dim pb As HPageBreak, rngHPB As Range
        Set rngHPB = .HPageBreaks(.HPageBreaks.Count).Location
        i = rngHPB.Row               'положение последнего разрыва
        N = .UsedRange.Rows.Count    'всего строк в документе
        If N - i < 4 Then            '4 - к-во строк в "пятке" документа:
            .HPageBreaks.Add .Cells(N - 4, 1)  'она не должна разрываться.
        End If
       
        'Cells(1, 3).Value = i
        'Cells(1, 4).Value = N
    End If
End With
End Sub


Мои извинения за подробный и банальный код, но... поимев долгий и очень извращенный секс, пытаясь запустить "ну почти то что мне нужно"... решил выложить. Может быть кому-то именно это и надо.

Всем спасибо за участие.


P.S. Да, забыл... макрос должен лежать в модуле. Я положил на лист и ... в общем имел очень много секса. Evil or Very Mad
dvt
Участник со стажем
Неподтвержденный


Вступление в Клуб: 22.10.2012
СообщениеВт Мар 12, 2013 12:02    Ответить с цитатой
Полезность: Нет оценки
Дополнение к ранее сказанному. Только что влетел в еще одни грабли. При количестве страниц (при печати) превышающем 4... отчет "ложился" при отработке макроса. Ошибка звучала "Subscript out of range". Отчет ложился на строчке:
Код:
        Set rngHPB = .HPageBreaks(.HPageBreaks.Count).Location

Опытным путем выяснилось, что количество разрывов может быть каким угодно, но при попытке обращения к элементу массива (HPageBreaks) большему чем 3... макрос падает. Оказывается, что не смотря, что Excel показывает столько разрывов сколько должно быть, в реальности в массиве HPageBreaks хранится информация только о первых трех. Что бы появилась информация о всех разрывах, надо перейти в страничный режим работы. Ну а поскольку это неудобно пользователю, то потом уже просто вернул все назад. Итоговый вариант макроса теперь выглядит так:
Код:
Sub Macros2()
'
' Macros2 Макрос
'
ActiveWindow.View = xlPageBreakPreview
With ActiveSheet                     'лист с отчетом "для печати"
    If .HPageBreaks.Count > 0 Then
        Dim pb As HPageBreak, rngHPB As Range
       
        Set rngHPB = .HPageBreaks(.HPageBreaks.Count).Location
        i = rngHPB.Row               'положение последнего разрыва
        N = .UsedRange.Rows.Count    'всего строк в документе
        If N - i < 4 Then            '4 - к-во строк в "пятке" документа:
            .HPageBreaks.Add .Cells(N - 4, 1)  'она не должна разрываться.
        End If
       
        'Cells(1, 3).Value = i
        'Cells(1, 4).Value = N
    End If
End With
ActiveWindow.View = xlNormalView
End Sub

Настроение: Evil or Very Mad
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru