====== Опции шаблонов Excel: группировка, итоги и остальные опции ======
Эта страница — **дополнение** к основной: «[[docs:settings:templates_option|Опции шаблонов Excel]]». Там описаны опции,
которые используются чаще всего. Здесь — то, чего там нет:
* группировка (''Group'') со **всеми** параметрами и тем, как она устроена внутри;
* опции области, управляющие итогами (''SummaryAbove'', ''DisableGrandTotals'' и другие);
* оформление строк итогов — откуда берутся формат и цвет;
* остальные опции пакета, не вошедшие в основную страницу (диаграммы, сводные таблицы,
служебные опции листа и книги).
Правила записи опций (разделители '';'' и ''\'', перевод строки через **Alt+Enter**, регистр
не важен) — те же, что на основной странице, и здесь не повторяются.
===== 1. Как устроена группировка =====
Понимание механики экономит много времени: почти все «странности» группировки объясняются тем,
что её делает **сам Excel**, а шаблон только задаёт параметры.
==== Что происходит по шагам ====
- **Сортировка.** Область сортируется по колонкам группировки — если не задан ''GroupNoSort''.
- **Промежуточные итоги.** Для каждого уровня группировки выполняется команда Excel
«Промежуточные итоги» (''Range.Subtotal''). Она вставляет строки итогов и строит **структуру**
(те самые «плюсики» слева).
- **Оформление.** На строки итогов накладываются формат и формулы **строки-образца** —
нижней служебной строки области (см. раздел 4).
- **Объединение подписей** (''mergelabels'') — ключ группы объединяется по строкам блока.
- **Структура и свёртка** (''disableoutline'', ''collapse'').
- **Общий итог** — его тоже делает Excel, одной строкой на всю область.
==== Три действующих лица ====
^Что ^Где задаётся ^Роль ^
|**Колонка-ключ**|''Group'' в служебной строке под колонкой|По её значениям данные делятся на группы. Колонок может быть несколько — это уровни, они идут **слева направо**|
|**Колонки агрегатов**|''Sum'', ''Avg'', ''Count'' и т. д. под колонками|Что именно считать в строках итогов|
|**Строка-образец**|нижняя служебная строка области|Её формат (и её формулы) переносятся на каждую строку итогов|
==== Подпись строки итога ====
Текст подписи формирует **Excel**, а не шаблон. Он зависит от функции агрегата и от языка Excel:
^Агрегат ^Подпись группы ^Подпись общего итога ^
|''Sum''|''Кабель ВВГ Итог''|''Общий итог''|
|''Count'' / ''CountNums''|''Кабель ВВГ Количество''|''Общее количество''|
|''Avg''|''Кабель ВВГ Среднее''|''Общее среднее''|
Подпись пишется **в колонку своего уровня** — ту, под которой стоит ''Group''.
Переадресовать её в другую колонку можно параметром ''placetocolumn'' (см. ниже).
>Если в колонке-ключе значение **пустое**, подпись получается просто «'' Итог''» — это нормально
>и означает «группа без значения ключа». Такие строки группируются отдельно и получают свои
>подытоги, как любые другие.
===== 2. Опция Group — все параметры =====
Ставится в служебной строке области, **под колонкой**, по которой группируем.
Параметры добавляются через ''\'' и могут сочетаться:
Group\MergeLabels\DisableSubtotals
^Параметр ^Что делает ^
|''Asc'' / ''Desc''|Направление предварительной сортировки по этой колонке|
|''MergeLabels''|Объединить ячейки ключа по строкам группы|
|''MergeLabels2''|То же, но в объединение входит и строка итогов этого уровня|
|''MergeLabels3''|Как ''MergeLabels2'', см. оговорку ниже|
|''WithHeader''|Выводить подпись группы **отдельной строкой над** блоком|
|''PlaceToColumn=N''|Писать подпись группы не в свою колонку, а в колонку N области|
|''Collapse''|Свернуть структуру до этого уровня|
|''DisableSubtotals''|У этого уровня **не** выводить строки итогов|
|''DisableOutline''|Не строить структуру («плюсики») по этому уровню|
|''PageBreaks''|Разрыв страницы после каждой группы этого уровня|
|''SummaryAbove'' / ''SummaryBelow''|Позиция строки итогов **именно этого** уровня|
==== MergeLabels, MergeLabels2, MergeLabels3 ====
Самый частый вопрос — чем они отличаются.
**''MergeLabels''** — объединяются ячейки ключа **по строкам данных** группы. Строка итогов
этого уровня в объединение **не входит**: в ней остаётся собственная подпись («Кабель ВВГ Итог»).
**''MergeLabels2''** — в объединение входит и **строка итогов** этого уровня. В объединённой
ячейке остаётся значение ключа (подпись итога при этом гасится, чтобы в объединении не всплыл
текст «Итог» вместо наименования).
**''MergeLabels3''** — в отчётах **с агрегатами** (там, где есть ''Sum'' и подобные) ведёт себя
так же, как ''MergeLabels2''. Разница проявляется только в отчётах **без агрегатов**: там
''MergeLabels2'' оставляет значение в объединённой ячейке, а ''MergeLabels3'' её очищает и при
этом строит структуру. Вариант экзотический — если не уверены, используйте ''MergeLabels2''.
>**Важно для уровня с ''DisableSubtotals''.** У такого уровня своих строк итогов нет, поэтому
>''MergeLabels'' и ''MergeLabels2'' дают **одинаковый** результат: включать в объединение нечего.
==== WithHeader ====
Подпись группы выводится **отдельной строкой над** блоком (как заголовок раздела), а не в
строке итогов. Строка вставляется и оформляется по строке-образцу.
Включение ''WithHeader'' хотя бы на одном уровне меняет режим у **всех** уровней выше него.
==== PlaceToColumn=N ====
Подпись группы пишется в колонку **N области** (не листа). Нумерация ведётся **с нуля**:
''PlaceToColumn=0'' — первая колонка области. Удобно, когда группируем по технической колонке
(например по ''GOOD_ID''), а показать наименование нужно в другой.
==== Collapse ====
Сворачивает структуру. Если поставить у вложенного уровня — свернёт **до этого уровня**.
Альтернатива с явным указанием глубины — опция области ''Outline\CollapseLevel=N''.
==== DisableSubtotals ====
Уровень участвует в группировке (сортировка, объединение подписей, структура), но строк итогов
по нему **нет**. Типовой случай: по товару нужны подытоги, а по разделу — только объединённая
подпись.
Что при этом важно знать:
* подытоги **вложенных** уровней считаются в пределах внешней группы, даже если у внешнего
уровня итоги отключены;
* строка **общего** итога остаётся — она управляется отдельной опцией ''DisableGrandTotals'';
* если ''DisableSubtotals'' стоит у **всех** уровней, строка общего итога всё равно выводится,
но **без подписи** (подписывать единственную строку итогов незачем).
==== DisableOutline ====
Отключает структуру (группировку строк «плюсиками») по этому уровню. Сами строки итогов
остаются. Нужно, когда документ уходит на печать и «плюсики» в нём не нужны.
==== PageBreaks ====
После каждой группы этого уровня ставится разрыв страницы. Не путать с опцией листа
''RangeBreaks'' — та режет страницы **по вместимости** и повторяет шапку; ''PageBreaks'' режет
**по смыслу**, на границах групп.
==== SummaryAbove / SummaryBelow у колонки ====
Позиция строки итогов **этого** уровня: над данными группы или под ними. Задаётся параметром
колонки и переопределяет общий режим области.
Group\MergeLabels\SummaryAbove
Типовой случай: общий режим — «итоги сверху» (так удобнее читать длинный отчёт), а у
самой вложенной подгруппы итог нужен снизу, сразу после её строк.
>Уровни без своего параметра берут режим области (''SummaryAbove'' / ''SummaryBelow'' у области,
>см. раздел 3). Если не задано ничего — итоги **снизу**, как в Excel по умолчанию.
===== 3. Опции области, управляющие итогами =====
Ставятся в **левой нижней** ячейке области (там же, где ''RowsFit'' и ''AutoFilter'').
^Опция ^Что делает ^
|''SummaryAbove''|Строки итогов **над** данными группы — для всей области|
|''SummaryBelow''|Строки итогов **под** данными (поведение по умолчанию)|
|''DisableGrandTotals''|Не выводить строку **общего** итога|
|''GroupNoSort''|Не сортировать перед группировкой|
|''Outline\CollapseLevel=N''|Свернуть структуру до уровня N|
|''AutoFilter''|Автофильтр по области (ставится по имени области, с группировкой совместим)|
''GroupNoSort'' можно поставить и шире — в **A1** (на всю книгу) или в **A2** (на лист).
Это удобно, когда отчёт заведомо приходит отсортированным из запроса.
>**Когда ''GroupNoSort'' не просто ускоряет, а необходим** — см. ограничение на три ключа
>сортировки в разделе 7.
===== 4. Оформление строк итогов =====
Строки итогов оформляются по **строке-образцу** — это **нижняя служебная строка области**
(та самая, в которой написаны ''Group'', ''Sum'' и прочие опции). Она не попадает в готовый
отчёт: после построения её удаляют, а её оформление уезжает на строки итогов.
Что переносится:
* **формат** ячеек — шрифт, рамки, заливка, числовой формат, выравнивание;
* **формулы** строки-образца — там, где её ячейка не пуста. Это позволяет положить в строку
итогов свою формулу вместо той, что пишет Excel.
==== Свой цвет на каждый уровень ====
Заливка и цвет шрифта строки итогов берутся **из ячейки строки-образца в колонке своего уровня**.
Это значит:
* покрасьте ячейку служебной строки **в колонке группы** — так будут выглядеть итоги группы;
* покрасьте ячейку **в колонке подгруппы** — так будут выглядеть итоги подгруппы.
Строка **общего** итога оформляется по колонке самого внешнего уровня.
Колонка X (группа): Group\MergeLabels ← ячейку залить, скажем, серым
Колонка AG (подгруппа): Group\MergeLabels ← ячейку залить светло-серым
Колонка M (сумма): Sum
Итоги группы получатся серыми, итоги подгруппы — светло-серыми, остальной формат (рамки,
числовой формат, шрифт) — общий, из строки-образца.
===== 5. Что происходит с «неудобными» значениями ключа =====
^Случай ^Поведение ^
|**Пустое** значение ключа|Образует свою группу со своими подытогами. Подпись итога выглядит как «'' Итог''»|
|В ключе **формула**|Группировка идёт по **результату** формулы. Движок пересчитывает лист перед выполнением опций, поэтому «невычисленная» формула группировку больше не ломает|
|В ключе **ошибка** (''#ЗНАЧ!'', ''#Н/Д'')|Строки с ошибкой не роняют построение: такие значения сравниваются как текст. Но в отчёте ошибка останется видна — это дефект шаблона, его надо править|
|Разный **регистр** («Кабель» и «кабель»)|Разные группы: сравнение регистрозависимое|
===== 6. Общий итог =====
Строку общего итога делает Excel, одну на всю область, в том же режиме (сверху/снизу), что и
остальные итоги.
* Убрать — опция области ''DisableGrandTotals''.
* Подпись («Общий итог») Excel пишет в колонку **самого внешнего** уровня группировки —
независимо от того, у каких уровней итоги отключены.
* Если итоги отключены у **всех** уровней, строка общего итога выводится, но **без подписи**:
формулы в колонках агрегатов есть, текста нет. Если подпись нужна — напишите её в
строке-образце, в нужной колонке: формулы и текст образца переносятся на строку итогов.
===== 7. Ограничения и ловушки =====
==== Сортировка: три ключа, иначе не сортирует вовсе ====
Excel сортирует максимум по **трём** колонкам за один проход. Движок использует один проход,
поэтому:
>Если колонок с ''Sort'' / ''Asc'' / ''Desc'' **и** ''Group'' в сумме больше трёх —
>область не сортируется **вообще** (не «по первым трём», а совсем).
Это самая частая причина «группировка порвалась на части»: при четырёх уровнях группировки
данные приходят неотсортированными, и одна и та же группа встречается в отчёте несколько раз.
**Что делать:** сортировать данные **в запросе отчёта** (''ORDER BY'') и поставить области
''GroupNoSort''. Это и правильнее, и быстрее.
==== Произвольные области ====
''Group'', ''Sort'' и ''AutoFilter'' работают только в тех областях, где одна запись занимает
ровно **одну строку** шаблона. В произвольной области (запись на несколько строк, объединённые
ячейки) они молча ничего не делают. Для таких областей есть отдельная опция ''GroupWithHeader''
(раздел 9).
==== Глубина структуры ====
Структура Excel ограничена **8 уровнями**. Каждый уровень группировки с итогами занимает
уровень структуры. Практический потолок — 3–4 уровня; дальше отчёт всё равно нечитаем.
==== Вложенные области (master/detail) ====
Опции области (''RowsFit'', ''SummaryAbove'' и т. п.) указывайте у **самой внешней** области.
==== Порядок уровней ====
Уровни группировки идут **слева направо** по колонкам шаблона. Чтобы поменять их местами,
надо поменять местами колонки, а не порядок опций.
==== Сортировка и схлопывание строк ====
''GroupRowID'' / ''GroupRowSum'' (схлопывание одинаковых строк, см. основную страницу) работают
**до** подсчёта итогов. То есть итоги считаются уже по схлопнутым строкам — это обычно и нужно.
===== 8. SmartGroup =====
Отдельный, независимый механизм группировки. Ставится так же — в служебной строке под
колонкой-ключом.
Отличия от ''Group'':
* предварительной сортировки **нет** по умолчанию (как если бы всегда стоял ''GroupNoSort'');
* объединение подписей (''MergeLabels'') включено **по умолчанию**;
* подытоги строятся собственным кодом, а не командой Excel «Промежуточные итоги».
Параметры: ''MergeLabels'', ''MergeLabels2'', ''DisableSubtotals'', ''PageBreaks''.
Параметры ''WithHeader'', ''DisableOutline'', ''DisableGrandTotals'' в коде **зарезервированы**,
но не реализованы — рассчитывать на них не стоит.
>Для новых шаблонов используйте обычную ''Group'': она отлажена, покрыта параметрами и ведёт
>себя предсказуемо. ''SmartGroup'' остаётся для совместимости со старыми шаблонами.
===== 9. GroupWithHeader =====
Опция **области** для **произвольных** областей — там, где одна запись занимает несколько строк
шаблона и обычная ''Group'' не работает.
GroupWithHeader\GroupCount=2
''GroupCount=N'' — сколько первых строк блока считаются заголовком группы (по умолчанию 1).
Итоги берутся из колонок, помеченных ''Sum'', ''Avg'' и т. д.
>Опция редкая и в шаблонах НЭП почти не встречается. Перед применением проверьте результат
>на макете: поведение сильно зависит от геометрии области.
===== 10. Прочие опции, которых нет в основной странице =====
==== Итоги ====
^Опция ^Где ^Что делает ^
|''Sum\TotalOfRow=N''|столбец|Для **произвольной** области: считать итог только по тем строкам, которые порождены N-й строкой блока шаблона. По умолчанию 1|
==== Лист и книга ====
^Опция ^Где ^Что делает ^
|''Hide''|A2|Скрыть лист в готовом отчёте|
|''SheetHide''|A2|Скрыть лист «жёстко» (не виден в списке скрытых листов Excel)|
|''Delete''|A2|Удалить лист из готового отчёта. Удобно для листов-справочников, которые нужны только при построении|
|''AutoScale''|A1 / A2|Подогнать масштаб печати под ширину страницы|
|''AutoSafe''|A1 / A2|Автосохранение книги после построения|
|''ShowPivotBar''|A1|Показать панель сводных таблиц|
==== Область и столбец ====
^Опция ^Где ^Что делает ^
|''OnlyValues''|столбец|Заморозить формулы только в **одном столбце** области|
|''RowsFit'' / ''RowsFit2''|A1 / A2|Подгон высоты строк не по области, а на весь лист или всю книгу|
|''ColsFit''|A1 / A2 / столбец|Подгон ширины: на книгу, на лист или на отдельный столбец|
|''DeleteColumn''|столбец|Удалить столбец из готового отчёта. Для технических колонок (ключи, служебные вычисления), которые нужны при построении, но не нужны получателю|
|''Outline\CollapseLevel=N''|область|Свернуть структуру до уровня N|
|''Chart\Name=ИмяДиаграммы''|область|Построить диаграмму по данным области|
===== 11. Сводные таблицы (Pivot) =====
Отдельный пакет опций. Опция области:
Pivot\Name=ИмяСводной\Dst=Лист2!A1\RowGrand\ColumnGrand
^Параметр ^Что делает ^
|''Name=''|Имя создаваемой сводной таблицы|
|''Dst=''|Куда её поместить (адрес ячейки, можно на другом листе)|
|''DataToRows''|Поля данных — в строки, а не в столбцы|
|''RowGrand'' / ''ColumnGrand''|Общие итоги по строкам / по столбцам|
|''MergeLabels''|Объединять подписи|
|''NoPreserveFormatting''|Не сохранять форматирование при обновлении|
|''Refresh=СводнаяN''|Обновить перечисленные существующие сводные таблицы|
|''RefreshChart=ДиаграммаN''|Обновить перечисленные сводные диаграммы|
Роль каждой колонки задаётся в служебной строке области:
^Опция ^Роль колонки в сводной ^
|''Row''|В строки|
|''Column''|В столбцы|
|''Data''|В значения|
|''Page''|В фильтр страницы|
В сводной таблице также работают ''Group'' (с параметрами ''Asc'', ''Desc'', ''Collapse'')
и ''GroupNoSort''.
===== 12. Диагностика: группировка «не работает» =====
^Симптом ^Проверьте ^
|Группы повторяются по нескольку раз|Данные не отсортированы. Колонок с ''Sort''+''Group'' больше трёх → сортировки не было вообще. Сортируйте в запросе + ''GroupNoSort''|
|Группировки нет совсем|Область произвольная (запись занимает больше одной строки) — ''Group'' в таких не работает|
|Подытогов нет, а подписи объединились|У уровня стоит ''DisableSubtotals''|
|Нет ни одного агрегата в строках итогов|Не указан ни один ''Sum'' / ''Avg'' / … под колонками|
|Строки итогов «съели» формат данных|Проверьте строку-образец: именно её формат переносится на итоги|
|Итоги не того цвета|Цвет берётся из ячейки строки-образца **в колонке своего уровня**, а не из всей строки|
|Объединённая подпись показывает «Итог» вместо наименования|Так ведёт себя ''MergeLabels2'' в старых сборках; в актуальной подпись итога гасится автоматически|
|Отчёт строится заметно дольше|Переопределение позиции итогов по уровням (''SummaryAbove'' / ''SummaryBelow'' у колонки) требует перестановки строк. Если разницы в позиции не нужно — не задавайте параметр|
===== 13. Готовые сочетания =====
==== Отчёт по разделам и товарам, итоги снизу ====
Служебная строка области:
Раздел: Group\MergeLabels2
Товар: Group
Количество: Sum
Сумма: Sum
Левая нижняя ячейка области:
RowsFit
==== Длинный отчёт: итоги сверху, свёрнутый по разделам ====
Раздел: Group\MergeLabels2\Collapse
Товар: Group
Сумма: Sum
Левая нижняя ячейка области:
SummaryAbove
==== Разделы — только подписью, итоги только по товару ====
Раздел: Group\MergeLabels\DisableSubtotals\DisableOutline
Товар: Group
Сумма: Sum
==== Печатная форма: каждый раздел с новой страницы ====
Раздел: Group\MergeLabels2\PageBreaks
Товар: Group
Сумма: Sum
==== Данные уже отсортированы запросом ====
Левая нижняя ячейка области:
GroupNoSort
Обязательно, если уровней группировки и сортировки в сумме больше трёх.