Имя: Пароль:
1C
1С v8
Чтение иерархического файла Excel
,
0 Oz11
 
03.12.12
16:23
здравствуйте. есть задача прочитать иерархический файл excel. читать собираюсь в дерево значений, чтобы потом удобно создавать элементы в справочнике. не могу определить алгоритм считывания данных. как из екселя выудить информацию что текущая строка принадлежит определенному родителю?
1 Wobland
 
03.12.12
16:26
а там родители есть вообще?
2 Wobland
 
03.12.12
16:26
записать макрос со свёрткой строк и посмотреть?
3 Oz11
 
03.12.12
16:28
читаю очередную строку из файла и среди реквизитов строки СОМобъекта не нахожу ничего похожего ни на родителя, ни на даже уровень этой строки в дереве.
ПС. с макросами не дружу.
4 Wobland
 
03.12.12
16:41
сдаётся мне, оно не знает, что к чему
http://screencast.com/t/euq2Bq1J
5 Oz11
 
03.12.12
17:47
(4) наверное это должно было мне как-то помочь.
6 Wobland
 
03.12.12
17:52
(5) понял, как над макросами медитировать? ;)
7 Oz11
 
03.12.12
17:56
(6) да. спасибо. очень полезная штука. но вот не дошло все равно как определить родителя текущей строки? (если структура хранит все именно так)
8 Wobland
 
03.12.12
18:00
(7) да я не знаю. скажи, что такое родитель с точки зрения екселя?
9 Oz11
 
03.12.12
18:26
вот что я нашел: ActiveSheet.Rows(ActiveCell.Row).OutlineLevel
показывает текущий уровень строки в структуре сгруппированных строк. теперь осталось обрисовать алгоритм как лучше хранить ссылку на текущего родителя в дереве, чтобы последовательно разворачивать дерево по мере считывания данных из файла.
10 Wobland
 
03.12.12
18:45
(9) вот можешь же ;)
11 Oz11
 
03.12.12
18:58
кому может быть полезно - вот код:
   ActiveCell  = Excel.ActiveCell.SpecialCells(xlLastCell);
   RowCount    = ActiveCell.Row;
   ColumnCount = ActiveCell.Column;
   
   НомерСтроки  = 3;
   НомерКолонки = 1;
   
   ДеревоЗагрузки.Строки.Очистить();
   СтруктураРодителей.Очистить();
   СтруктураРодителей.Вставить("Уровень_0", ДеревоЗагрузки);
   
   Для Row = НомерСтроки По RowCount Цикл
       
       Уровень = ExcelЛист.Rows(Row).OutlineLevel;
       
       ТекущаяСтрока = СтруктураРодителей["Уровень_"+(Уровень-1)].Строки.Добавить();
       
       ТекущийНомерКолонки = 1;        
       Для каждого КолонкаТаблицы Из ДеревоЗагрузки.Колонки Цикл
           
           ТекущаяСтрока[КолонкаТаблицы.Имя] = ExcelЛист.Cells(Row, ТекущийНомерКолонки).Value;
           ТекущийНомерКолонки = ТекущийНомерКолонки + 1;
           
       КонецЦикла;
       
       // заполним структуру родителей
       СтруктураРодителей.Вставить("Уровень_"+Уровень, ТекущаяСтрока);
       
   КонецЦикла;

ДеревоЗагрузки - переменная типа дерево значений с определенными колонками,
СтруктураРодителей - переменная типа Структура, хранящая текущего родителя каждого уровня при прохождении текущей строки
12 Wobland
 
03.12.12
19:00
на всякий случай
   ПоследняяСтрока=Sheet.Cells.SpecialCells(11).Row;
13 Oz11
 
03.12.12
19:04
(12) проверил. действительно последняя строка дерева не заполняется подчиненными строками.
14 Oz11
 
03.12.12
19:20
походу все дело в том что берутся активные строки листа ActiveCell  = Excel.ActiveCell.SpecialCells(xlLastCell);,
по умолчанию группировки свернуты в екселе и выходит что последняя группировка не раскрыта. думаю из-за этого код, приведенный выше, определяет не все вложенные строки.
возникает еще один вопрос. как взять в листа не активные строки, а все (и те что скрыты)?
15 Oz11
 
03.12.12
19:35
исправляем (11):
   //RowCount    = ActiveCell.Row;
   RowCount    = ExcelЛист.Cells.CurrentRegion.Rows.Count;
16 GrGuest
 
05.12.12
11:10
И от меня спасибо!
AdBlock убивает бесплатный контент. 1Сергей