Печать в EXCEL. Многостраничный отчет.
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
dvt Участник со стажем
Вступление в Клуб: 22.10.2012
|
Пт Фев 08, 2013 14:56  Печать в EXCEL. Многостраничный отчет. |
|
Полезность: Нет оценки
|
Ситуация, наверное классическая, но... смешно , но я впервые с этим столкнулся в таком виде. Никто из коллег не знает как решить проблему. Суть проблемы: есть отчет. У него есть шапка (содержит вычисляемые значения), есть таблица отчета (название колонок + некоторое количество строк содержимого), есть подвал (подписи и т.п.). Все это формируется на базе шаблона (туда я вынес исключительно заголовок таблицы, т.к. все остальное вычисляется). В шаблоне для строки с заголовком таблицы указал в "Печать на каждой странице. Сквозные строки." Все замечательно, за исключением ситуации, когда на последнюю страницу не влезает совсем чуть-чуть - часть или весь подвал (подписи и т.п.). В таком случае на последней странице получаю заголовок таблицы и сразу после него подписи. Решение напрашивается - ставить после предпоследней строки таблицы принудительный разрыв страницы функцией EXCEL.PutPageBreak( row ). Вот только как узнать, что подвал отчета не помещается на последнюю страницу? Высота строк в таблице может быть разной (стоит перенос слов и автоподбор высоты). Соответственно тупо считать по заранее известным значениям не получиться (раньше такой вариант у меня проходил - везло с отчетами). Установка высоты строки в библиотеке есть, а получение высоты строки нет. .
Буду признателен за подсказку.
Может быть есть какой-то другой вариант получения адекватнооформленного отчета... буду тоже признателен. |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Пн Фев 11, 2013 04:59   |
|
Полезность: Нет оценки
|
>> за исключением ситуации, когда на последнюю страницу не влезает совсем чуть-чуть - часть или весь подвал (подписи и т.п.). В таком случае на последней странице получаю заголовок таблицы и сразу после него подписи.
1. Может какой-н SP для офиса фиксит эту проблему ?
2. Может использовать не сквозные, а колонтитулы ?
3. Можно тупо всегда брать и рвать страницу перед последними одной-двумя(N) строками  |
|
 |
dvt Участник со стажем
Вступление в Клуб: 22.10.2012
|
Пн Фев 11, 2013 06:37   |
|
Полезность: Нет оценки
|
Alkov пишет: | >> за исключением ситуации, когда на последнюю страницу не влезает совсем чуть-чуть - часть или весь подвал (подписи и т.п.). В таком случае на последней странице получаю заголовок таблицы и сразу после него подписи.
1. Может какой-н SP для офиса фиксит эту проблему ?
2. Может использовать не сквозные, а колонтитулы ?
3. Можно тупо всегда брать и рвать страницу перед последними одной-двумя(N) строками  |
1. Он может пофиксить только если будет понимать, что из себя предстваляет содержимое файла. Сам по себе он понять не в состоянии, значит надо ему "объяснить". Вопрос как?
2. Колонтитул штука хорошая. Но я не понял как туда вносить данные. Например, пользователь выбирает, кто подписывает отчет, соответсвенно, выбраный должен фигурировать в подписи. Как передать эти данные в колонтитул? Лично я не знаю. Но если кто-то подскажет - буду признателен.
3. Это решает озвученную проблему, но создает другую - если на последней странице 2-3 строки с таблице, то принудительный разрыв перед последнии 1-2 строчками создаст маразм - предпоследняя страница с 1-2 строчками, а за ней последняя с 1-2 строчками.
P.S. Неужели никто с такие проблемы не решал??? Ведь однозначно - классика печати отчета.  |
|
 |
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"'); |
|
Спасибо. Учту на будущее.
Проблема в том, что задумавшись о колонтитуле... я упустил, что он печатается на каждой странице. А вот это мне совершенно ненужно. Как это побороть?
Заодно еще один вопрос - можно ли как-то управлять шрифтом в колонтитуле? В смысле: часть левого колонтитула жирная, часть обычная. |
|
 |
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. Да, забыл... макрос должен лежать в модуле. Я положил на лист и ... в общем имел очень много секса.  |
|
 |
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 |
Настроение:  |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|