База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как вывести таблицу значений с группами в Excel с иерархией и сворачиванием? › Ответ в теме: Как вывести таблицу значений с группами в Excel с иерархией и сворачиванием?
Да, такой вывод в Excel с листами по группам и иерархической группировкой (категория — подкатегория — номенклатура) с возможностью сворачивания реализуем. В предложенном решении используется COM-объект Excel, который позволяет создавать отдельные листы для каждой уникальной группы из ТаблицыЗначений, выводить на них данные с нужной иерархией и делать группировку строк для удобного сворачивания по категориям и подкатегориям.
Ключевые моменты решения:
— Для каждой уникальной группы создаётся отдельный лист с именем группы (обрезанным до 31 символа).
— Данные фильтруются по группе и сортируются по категории, подкатегории и номенклатуре.
— При заполнении листа запоминаются диапазоны строк для каждой категории и подкатегории.
— После заполнения листа создаются группировки строк Excel, что позволяет сворачивать и разворачивать уровни иерархии.
— Автоматически подгоняется ширина колонок для удобства просмотра.
Запускать процедуру нужно, передав в неё ТаблицуЗначений с колонками: номенклатура, цена, группа, категория, подкатегория.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
Процедура ВывестиВЭксельПоГруппам(ТаблицаЗначений) Если ТаблицаЗначений.Пустая() Тогда Сообщить("Таблица значений пуста"); Возврат; КонецЕсли; Если ТипПлатформы() <> ТипПлатформы.Windows Или Не ЗначениеЗаполнено(ОбработкаАктивна()) Тогда Сообщить("Запуск из интерфейса Unix не поддерживается."); Возврат; КонецЕсли; ИмяПараметровДиапазона = "Начало, Конец"; НомерВторогоЛистаДляУдаления = 2; МаксимальнаяДлинаИмениЛиста = 31; КолонкаКатегория = 1; КолонкаПодкатегория = 2; КолонкаНоменклатура = 3; КолонкаЦена = 4; НачальнаяСтрокаДляДанных = 2; УникальныеГруппы = Новый Массив; Для Каждого Строка Из ТаблицаЗначений Цикл Если УникальныеГруппы.Найти(Строка.Группа) = Неопределено Тогда УникальныеГруппы.Добавить(Строка.Группа); КонецЕсли; КонецЦикла; Excel = Новый COMОбъект("Excel.Application"); Excel.Visible = Истина; Excel.DisplayAlerts = Ложь; Книга = Excel.Workbooks.Add(); Пока Книга.Worksheets.Count > 1 Цикл Книга.Worksheets.Item(НомерВторогоЛистаДляУдаления).Delete(); КонецЦикла; ИндексЛиста = 1; Для Каждого Группа Из УникальныеГруппы Цикл Если ИндексЛиста = 1 Тогда Лист = Книга.Worksheets.Item(1); Иначе Лист = Книга.Worksheets.Add(, Книга.Worksheets.Item(Книга.Worksheets.Count)); КонецЕсли; Лист.Name = Лев(Группа, МаксимальнаяДлинаИмениЛиста); Лист.Cells(1, КолонкаКатегория).Value = "Категория"; Лист.Cells(1, КолонкаПодкатегория).Value = "Подкатегория"; Лист.Cells(1, КолонкаНоменклатура).Value = "Номенклатура"; Лист.Cells(1, КолонкаЦена).Value = "Цена"; ОтборПоГруппе = ТаблицаЗначений.Выбрать(Новый Структура("Группа", Группа)); ОтборПоГруппе.Сортировать("Категория, Подкатегория, Номенклатура"); ТекущаяСтрока = НачальнаяСтрокаДляДанных; ТекущаяКатегория = ""; ТекущаяПодкатегория = ""; КатегорииГруппы = Новый Соответствие; ПодкатегорииГруппы = Новый Соответствие; Для Каждого Строка Из ОтборПоГруппе Цикл Если ТекущаяКатегория <> Строка.Категория Тогда КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория); ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока, ИмяПараметровДиапазона); ЗавершитьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока, ИмяПараметровДиапазона); ТекущаяКатегория = Строка.Категория; НачатьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока, ИмяПараметровДиапазона); ТекущаяПодкатегория = ""; КонецЕсли; Если ТекущаяПодкатегория <> Строка.Подкатегория Тогда КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория); ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока, ИмяПараметровДиапазона); ТекущаяПодкатегория = Строка.Подкатегория; КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория); НачатьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока, ИмяПараметровДиапазона); КонецЕсли; Лист.Cells(ТекущаяСтрока, КолонкаКатегория).Value = Строка.Категория; Лист.Cells(ТекущаяСтрока, КолонкаПодкатегория).Value = Строка.Подкатегория; Лист.Cells(ТекущаяСтрока, КолонкаНоменклатура).Value = Строка.Номенклатура; Лист.Cells(ТекущаяСтрока, КолонкаЦена).Value = Строка.Цена; ТекущаяСтрока = ТекущаяСтрока + 1; КонецЦикла; КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория); ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока, ИмяПараметровДиапазона); ЗавершитьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока, ИмяПараметровДиапазона); ПрименитьГруппировку(Лист, ПодкатегорииГруппы); ПрименитьГруппировку(Лист, КатегорииГруппы); Лист.Columns("A:D").AutoFit(); ИндексЛиста = ИндексЛиста + 1; КонецЦикла; Сообщить("Выгрузка в Excel завершена"); КонецПроцедуры Процедура НачатьДиапазон(КоллекцияГрупп, Ключ, Строка, ИмяПараметровДиапазона) Если Не ЗначениеЗаполнено(Ключ) Тогда Возврат; КонецЕсли; КоллекцияГрупп.Вставить(Ключ, Новый Структура(ИмяПараметровДиапазона, Строка, 0)); КонецПроцедуры Процедура ЗавершитьДиапазон(КоллекцияГрупп, Ключ, ТекущаяСтрока, ИмяПараметровДиапазона) Если Не ЗначениеЗаполнено(Ключ) Тогда Возврат; КонецЕсли; Если КоллекцияГрупп.Найти(Ключ) = Неопределено Тогда Возврат; КонецЕсли; Начало = КоллекцияГрупп[Ключ].Начало; КоллекцияГрупп.Вставить(Ключ, Новый Структура(ИмяПараметровДиапазона, Начало, ТекущаяСтрока - 1)); КонецПроцедуры Функция ПолучитьКлючПодкатегории(Категория, Подкатегория) Если Не ЗначениеЗаполнено(Категория) Или Не ЗначениеЗаполнено(Подкатегория) Тогда Возврат ""; КонецЕсли; Возврат Категория + "|" + Подкатегория; КонецФункции Процедура ПрименитьГруппировку(Лист, КоллекцияГрупп) Для Каждого Ключ Из КоллекцияГрупп.Ключи() Цикл Параметры = КоллекцияГрупп[Ключ]; Если Параметры.Конец > Параметры.Начало Тогда ДиапазонСтрок = (Параметры.Начало + 1) + ":" + Параметры.Конец; Лист.Rows(ДиапазонСтрок).Group(); КонецЕсли; КонецЦикла; КонецПроцедуры |