Сохранить дерево значений в excel или табличный документ
Добрый день,
Подскажите есть ли простой способ вывести в табличный документ сформированное дерево значений на форме или сохранить напрямую это дерево в excel с сохранением иерархии без формирования табличного документа?
Например есть стандартная команда формы в командной панели «Вывести список», можно ли к ней обратится программно и получить на выходе табличный документ? а полученный табличный документ можно сохранить в формате xls.
Перем ТабДок, Секция; Процедура ПечатьДерева (СтрокаДерева,Уровень = 0,Колонки) Для Каждого стр Из СтрокаДерева.Строки Цикл НомерКолонки = 0; отступ = ""; Для н = 1 По Уровень Цикл отступ = отступ + " "; КонецЦикла; Для Каждого КЛ Из Колонки Цикл НомерКолонки = НомерКолонки + 1; Секция.Область(1, НомерКолонки).Текст = ?(НомерКолонки = 1, отступ+стр[КЛ.Имя], стр[КЛ.Имя]); КонецЦикла; ТабДок.Вывести(Секция,Уровень+1); ПечатьДерева(стр,Уровень+1,Колонки); КонецЦикла; КонецПроцедуры Процедура СформироватьТабДок() ТабДок = Новый ТабличныйДокумент; Секция = ТабДок.ПолучитьОбласть("R1"); ТабДок.НачатьАвтогруппировкуСтрок(); ПечатьДерева (Дерево,,Дерево.Колонки); ТабДок.ЗакончитьАвтогруппировкуСтрок(); ВременныйКаталог = КаталогВременныхФайлов(); ИмяФайла = "Журнал выгрузки " + Формат( ТекущаяДата(), "ДФ = 'гггг-ММ-дд_чч-мм-сс'") + ".xls";; ИмяВременногоФайла = ВременныйКаталог + ИмяФайла; ТабДок.Записать(ИмяВременногоФайла , ТипФайлаТабличногоДокумента.XLS); КонецПроцедуры
Prad2002; Kilka_v_Kepke; It-developer; Jenya78; user1474628; hasp_x; nekit_rdx; curdate; bohdan-k; jane_de_rio; orfos; Legin; + 12 – Ответить
Источник
Вывод произвольного дерева на печать
Имеется задача: есть иерархический справочник (иерархия элементов) с произвольным набором данных. Как вывести это на печать в виде схемы(дерева) в виде элементов, связанных линиями по принципу родительства? Есть ли такой алгоритм?
(1) Гениальная идея. Это я и сам представляю. Как это все на печать вывести?
Типа, корневой элемент в центре, за ним подстраиваются подчиненные элементы, соединяются линиями. И потом, ведь у элемента на втором уровне может быть 10 подчиненных элементов 3 уровня, а у другого элемента второго уровня, всего 1 подчиненных элемент.
(2) То же мне умник.
(4) Возьми типовую «Торговля и Склад». Там не то, что алгоритм — готовая обработка есть. Чуток переделать — и вперёд.
(9) Нет хочу расположение элементов одного уровня в строчку, а не в столбик, как там.
(8) Поподробней плиз. Что там внутри творится?
(6) Почему малоинформативный? Кроме того, на самом деле в моей задаче не предполагается большая и сложная иерархия, макс. 10 уровней. Просто хочется сделать нечто универсальное.
(12) 10 уровней. Даже для бинарного дерева — 1024 элемента на нижнем уровне.
С обработкой генерации отчёта поставляются микроскопы для его чтения.
(11) Так и пытался сделать, но видно математики хорошей не хватает, непонятно как их правильно располагать, с какого уровня начинать.
(10) на словах — тоже самое что и в дереве доков, только у раруса стока завязок на глобальные универсальные функции, что без литры не выкусить и не запостить
(14) Сначала готовишь к печати (если так уж хочется горизонтально располагать уровни). Рекурсивная процедура/функция с параметрами Дерево, ШиринаБумаги и Лево.
(15) То есть, не факт, что процедура формирования этого отчёта будет работать, если что?
Кстати, 8 уровней — это 256. Тоже лупа нужна. И даже 6 уровней (64) — много не втиснешь.
(20) Дерево в виде ТЗ, с указанием уровней. Есть УровеньСМаксимальнымКоличествомЭлементов, КоличествоУровней.
(21) А что такое «связи между элементами на разных уровнях»? И что означает их «учитывать»?
По своему дереву — построй дерево из структур с полями Лево, Ширина, ТекстВнутри, Дети.
Полученное дерево — отрисуй.
(23) Я имел в виду следующее:
1-й уровень 1.0
2-й уровень 1.1 2.1
3-й уровень 1.2 2.2 3.2 4.1
4-й уровень 1.1 2.2 3.2 и т.д.
(24) Смогу конечно. Как связывать элементы между собой (линиями) в рекурсии?
(26) Так же, как они связаны в «Дереве документов». Создаются квадратики с изображением нужной линии и вставляются в нужное место.
Пусть у тебя есть класс Дерево, с функциями КоличествоДетей(Дерево), Сын(Дерево,НомерСына).
У узлов дерева есть .Лево, .Центр, .Содержание. (если нет — добавь).
Сначала размечаешь дерево:
Процедура РазметитьДляПечати(Дерево,ШиринаБумаги,ЛевыйКрай)
КолвоДетей = КоличествоДетей(Дерево);
ШиринаПоддерева = ШиринаБумаги/КолвоДетей+1;
Если КолвоДетей=0 Тогда
Дерево.Лево = ЛевыйКрай;
Дерево.Центр = ЛевыйКрай+ШиринаБумаги/2;
Иначе
Для нСын=1 По КолвоДетей Цикл
РазметитьДляПечати(Сын(Дерево,нСын),ШиринаПоддерева,ЛевыйКрай+ШиринаПоддерева*(нСын-1));
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Теперь у тебя у каждого узла есть, на каком расстоянии от края его печатать и где должен быть центр узла. Если хочешь — добавь каждому узлу пометку «Г»,»Т» или «-I», обозначающую форму линии, которая к этому узлу подходит сверху.
Теперь — перебор в ширину.
Заводишь глобальный список СписокУзловДляПечати. И заполняешь его рекурсивно (помечая чем-нибудь переходы на новый уровень).
Ну а затем — выводишь узлы из этого списка, не забывая переходить на новый уровень.
(30) имхается что у него не дерево, а сеть.
(т.е. между «листьями» тоже есть взаимосвязи, а не только от родителя к потомку
Источник
Дерево значений в печатную форму
Есть небольшая проблемка с выводом дерева значений на печатную форму. Подсмотрел в инете вот такой примерный код.
. ТабДок.НачатьАвтогруппировкуСтрок(); Уровень = 0; ВывестиСтрокуДерева(табДок, ОбластьРасшифровкиНоменклатуры, ВыборкаНоменклатуры, Уровень); ТабДок.ЗакончитьАвтогруппировкуСтрок(); . Функция ВывестиСтрокуДерева(табДок, ОбластьРасшифровкиНоменклатуры, СтрокаДереваЗначений, Уровень) Для Каждого СтрокаНоменклатуры Из СтрокаДереваЗначений.Строки Цикл ОбластьРасшифровкиНоменклатуры.Параметры.Наименование = СтрокаНоменклатуры.Номенклатура; ОбластьРасшифровкиНоменклатуры.Параметры.Товарооборот = СтрокаНоменклатуры.Стоимость; ТабДок.Вывести(ОбластьРасшифровкиНоменклатуры, Уровень, Ложь); ВывестиСтрокуДерева(табДок, ОбластьРасшифровкиНоменклатуры, СтрокаНоменклатуры, Уровень+1); КонецЦикла; КонецФункции;
Вместо дерева выводит что-то странное номенклатура поделеная в две группировки без имен
ВЫБРАТЬ Продажи.Регистратор КАК Регистратор, Продажи.Количество КАК Количество, Продажи.Стоимость КАК Стоимость, Продажи.Подразделение КАК Подразделение, Продажи.Номенклатура КАК Номенклатура, Продажи.Регистратор.КодСвязиРазделенныхРеализаций КАК РегистраторКод, Продажи.Номенклатура.Наименование КАК НаименованиеНоменклатуры ИЗ Справочник.Номенклатура КАК Товар ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи ПО Товар.Ссылка = Продажи.Номенклатура.Ссылка ГДЕ Продажи.Подразделение В(&ГруппаПодразделения) И НЕ Продажи.Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатура) И ВЫБОР КОГДА &ФЛАГ = ИСТИНА ТОГДА ИСТИНА ИНАЧЕ Продажи.Номенклатура.Категория = &АСС КОНЕЦ И Продажи.Регистратор.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоОтчета, ДЕНЬ) И КОНЕЦПЕРИОДА(&КонецОтчета, ДЕНЬ) УПОРЯДОЧИТЬ ПО Подразделение ИТОГИ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Регистратор), КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегистраторКод) ПО Номенклатура ИЕРАРХИЯ
Источник
Вывод бинарного дерева на экран в виде «дерева»
основная задача: подсчет количества листьев.
проблема: при просмотре хочу выводить бин. дерево, в красивом виде, возможно использование псевдографики
интересует алгоритм и идеи
Пы.Сы.: так же интересует любая инфа по теме основного задания.
Запись массива в виде бинарного дерева и вывод его на экран!
Задача: Зарандомить массив с 30 ел. от -100 до 100, создать бинарное дерево использую дан.
«Рекурсивная функция» (Обход бинарного дерева)
Привет всем, встретился с такой рекурсивной ф-ей, которая обходит бинарное дерево и выводит его на.
Запись бинарного дерева в файл и восстановление из него этого дерева
Задача такая: есть бинарное дерево. Каждый элемент дерева содержит 3 указателя — 1 указатель на.
Работа с бинарным деревом: добавить элемент, удалить элемент, вывести в виде «дерева»
Создать программу для работы с бинарным деревом, реализующую функции: добавить элемент, удалить.
Могу скинуть функцию распечатывания в консоли дерева. Она только немного будет на 90 градусов в лево перевёрнуто, но наглядно достаточно.
Добавлено через 1 минуту
А подсчёт кол-во листьев, просто обойти все дерево, в глубину или в ширину (как вам больше нравиться), тут лучше в ширину наверное будет, для подсчёта кол-ва.
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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
// лабаДеревья.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include #include #include #include #include #define FL typedef struct link { int key; link *left; link *right; } node; void GoToXY (short x, short y) { HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE); COORD coord = {x, y}; SetConsoleCursorPosition(StdOut, coord); } node * search (node * tree, int key) { node *buf; if (tree) do { buf=tree; if (tree->key==key) return NULL; if (keytree->key) tree=tree->left; else tree=tree->right; } while (tree); return buf; } int Add (node **tree, int key) { node * buf; #ifdef FL if (! ( buf = (node *) malloc ( sizeof (node) ) ) ) { printf ("\nNo free memory"); return -1; } #else buf = new node; #endif buf->key=key; buf->left=NULL; buf->right=NULL; if (!*tree) { *tree=buf; return 1; } if (search(*tree,key)) { if (keysearch(*tree,key)->key) search(*tree,key)->left=buf; else search (*tree,key)->right=buf; } else return -1; return 0; } /*void iteration (node * root) if (root) printf ("%5d", root->key); iteration (root->left); iteration (root->right); > >*/ void Free(node *&root) { if (root->left) Free(root->left); if (root->right) Free(root->right); #ifdef FL free ( root ); #else delete root; #endif root = NULL; } void print (node * root, short x, short y, short a, char c) { if (root) { if (a>0 && c!='k') { if (c=='l') x-=10; else x+=10; } else if (c!='k') if (c=='l') x-=4; else x+=4; GoToXY (x,y+=2); a--; printf ("%5d", root->key); print (root->left,x,y,a,'l'); print (root->right,x,y,a,'r'); } } void list (node * root, short x, short y, short a, char c) { if (root) { if (a>0 && c!='k') { if (c=='l') x-=10; else x+=10; } else if (c!='k') if (c=='l') x-=4; else x+=4; GoToXY (x,y+=2); a--; if ( !root->left && !root->right ) printf ("%5d", root->key); list (root->left,x,y,a,'l'); list (root->right,x,y,a,'r'); } } void del (node **root, int value) { if (!*root) { printf ("No key\n"); fflush (stdin); getch (); return ; } if (value (*root)->key) del (&(*root)->right,value); else if (value > (*root)->key) del (&(*root)->right,value); else { node *buf=(*root)->left; node *t =(*root)->right; free (*root); *root=t; while (*root) root = &(*root)->left; *root = buf; } } size_t Count ( node *root, bool f = true ) static size_t count; if ( f ) count = 0; if ( root ) { if ( ( root->left && ! root->right ) return count; } int main(int argc, char* argv[]) { node *tree=NULL; int key; char a; system ("cls"); //Add (&tree,3); Add (&tree,5); Add (&tree,1); Add (&tree,0); Add (&tree,7); Add (&tree,7); //print (tree,37,5,2,'k'); printf ("\n"); do { printf ("\n 1-Dobavit`; 2-Delete; 3- Print; 4 - list; 5 - Count; 6 - Del_Tree 0-Vuhod"); fflush (stdin); a=getch(); printf ("\n"); switch (a) { case '1' : while (!(fflush (stdin) ) && ! ( printf ("Enter key " ) && scanf ("%d",&key) ) ); Add (&tree,key); break; case '2' : while (!(fflush (stdin) ) && ! ( printf ("Enter key to delete " ) && scanf ("%d",&key) ) ); del (&tree, key); break; case '3' : printf ("Tree : "); if (!tree) printf ("None"); else //iteration (tree); print (tree,37,5,2,'k'); printf ("\n\n\n\n\n\n"); system ("pause"); break; case '4' : printf ("Tree list : "); if (!tree) printf ("None"); else //iteration (tree); list (tree,37,5,2,'k'); printf ("\n\n\n\n\n\n"); system ("pause"); break; case '5' : printf ("\n Count = %d \n", Count (tree) ); system ("pause"); break; case '6' : Free (tree); break; } system ("cls"); } while (a!='0'); system ("pause"); return 0; }
Источник