|
excel COM objects | ☑ | ||
---|---|---|---|---|
0
YurAnt
06.03.13
✎
14:39
|
Доброго времени суток, господа - форумчане.
Итак, ситуация следующая. Имеется excel-файл в к-м несколько листов, к-е могут содержать инфу: от четко-структурированной (той что необходима для чтения), до полной ахинеи (а ля просто пометки бухгалтера) есть обработка к-я делает следующее: 1) По тыку на кнопку выгружает ком.объект и формирует из листов екзеля список на форме. 2) Далее пользователь совершает даблтык по нужной строке, что приводит к выгрузке всего листа экзеля в дерево на форму. (далее элементы дерева проверяются на соответствие элементам справочника, но это уже другая история) Так вот сама проблема: при загрузке экзель-файла корректно отрабатывается только 1й раз выбор листа. Все последующие "выборы" пользователя не отрабатываются (точнее отрабатываются, но выборка идет из того экзель-листа к-й был выбран при первом выборе пользователя. (затем он видимо привязывается к файлу) Процедура заполнения "списка листов" список формы ______________________________________________________________ Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); Excel.ActiveWorkbook.Close(-1,); Excel.DisplayAlerts = 0; Excel.Application.Quit(); Excel.DisplayAlerts = 1; Excel = 0; Возврат; КонецПопытки; Попытка НашФайл1 = Excel.WorkBooks.Open(Файл); КоличествоЛистов1 = Excel.WorkSheets.Count; Для List = 1 to КоличествоЛистов1 цикл Лист1 = Excel.Sheets(List); ПолеСписка1.Добавить(Лист1.Name); КонецЦикла; Сообщить("Выберите Лист Excel - файла"); Исключение Сообщить(ОписаниеОшибки()); Excel.ActiveWorkbook.Close(-1,); Excel.DisplayAlerts = 0; Excel.Application.Quit(); Excel.DisplayAlerts = 1; Excel = 0; Возврат; КонецПопытки; КонецПроцедуры _______________________________________________________________ Заполнение дерева по выбору листа пользователем Процедура ПолеСписка1Выбор(Элемент, ЭлементСписка) Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); Excel.ActiveWorkbook.Close(-1,); Excel.DisplayAlerts = 0; Excel.Application.Quit(); Excel.DisplayAlerts = 1; Excel = 0; Возврат; КонецПопытки; Попытка НашФайл = Excel.WorkBooks.Open(Файл); Лист = Excel.WorkSheets(ЭлементСписка.Значение); ВсегоСтрок = Лист.UsedRange.Rows.Count; ВсегоКолонок = Лист.UsedRange.Columns.Count; ДеревоОбъект = Новый ДеревоЗначений; ДеревоОбъект.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("КолвоДетУзл", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("РазрядРабот", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("НВрВЧНаЕдИзм", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("РасцНаЕдИзм", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("НормВрВЧелЧасНаКомпл", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Строка")); ДеревоОбъект.Колонки.Добавить("Прим", Новый ОписаниеТипов("Строка")); Для к1 = 1 По 2 Цикл СтрокаУ1 = ДеревоОбъект.Строки.Добавить(); СтрокаУ1.Артикул = "Артикул"+к1; Для к2 = 1 По 2 Цикл СтрокаУ2 = СтрокаУ1.Строки.Добавить(); СтрокаУ2.Артикул = СтрокаУ1.Артикул+к2; КонецЦикла; КонецЦикла; СтрокаВысшегоУровня = Данные.Строки.Добавить(); Данные.Колонки.Добавить("Артикул"); Данные.Колонки.Добавить("КолвоДетУзл"); Данные.Колонки.Добавить("РазрядРабот"); Данные.Колонки.Добавить("НВрВЧНаЕдИзм"); Данные.Колонки.Добавить("РасцНаЕдИзм"); Данные.Колонки.Добавить("НормВрВЧелЧасНаКомпл"); Данные.Колонки.Добавить("Сумма"); Данные.Колонки.Добавить("Прим"); СтрокаВысшегоУровня.Артикул = Лист.Name(); Сообщить(СтрокаВысшегоУровня.Артикул); //ВсегоСтрок Для Row = 1 По 100 Цикл Если ЗначениеЗаполнено(Excel.Cells(Row,1).Value) Тогда СтрокаПервогоУровня = СтрокаВысшегоУровня.Строки.Добавить(); СтрокаПервогоУровня.Артикул = Excel.Cells(Row,1).Value; СтрокаВторогоУровня = СтрокаПервогоУровня.Строки.Добавить(); СтрокаВторогоУровня.Артикул = Excel.Cells(Row,4).Value; КонецЕсли; Если ((НЕ(ЗначениеЗаполнено(Excel.Cells(Row,1).Value))) и (ЗначениеЗаполнено(Excel.Cells(Row,4).Value))) Тогда СтрокаВторогоУровня = СтрокаПервогоУровня.Строки.Добавить(); СтрокаВторогоУровня.Артикул = Excel.Cells(Row,4).Value; СтрокаВторогоУровня.КолвоДетУзл = Excel.Cells(Row,5).Value; СтрокаВторогоУровня.РазрядРабот = Excel.Cells(Row,6).Value; СтрокаВторогоУровня.НВрВЧНаЕдИзм = Excel.Cells(Row,7).Value; СтрокаВторогоУровня.РасцНаЕдИзм = Excel.Cells(Row,8).Value; СтрокаВторогоУровня.НормВрВЧелЧасНаКомпл = Excel.Cells(Row,9).Value; СтрокаВторогоУровня.Сумма = Excel.Cells(Row,10).Value; СтрокаВторогоУровня.Прим = Excel.Cells(Row,11).Value; КонецЕсли; КонецЦикла; ЭлементыФормы.Данные.СоздатьКолонки(); Исключение Сообщить(ОписаниеОшибки()); Сообщить(ОписаниеОшибки()); Excel.ActiveWorkbook.Close(-1,); Excel.DisplayAlerts = 0; Excel.Application.Quit(); Excel.DisplayAlerts = 1; Excel = 0; Возврат; КонецПопытки; Excel.ActiveWorkbook.Close(-1,); Excel.DisplayAlerts = 0; Excel.Application.Quit(); Excel.DisplayAlerts = 1; Excel = 0; КонецПроцедуры ____________________________________________________________________ В общем вот такие вот дела... пытаюсь понять почему происходит такое вот "кэширование" объекта =/ |
|||
1
dk
06.03.13
✎
14:43
|
замени Excel.Cells на Лист.Cells
|
|||
2
dk
06.03.13
✎
14:43
|
Замени
Лист = Excel.WorkSheets(ЭлементСписка.Значение); на Лист = НашФайл.WorkSheets(ЭлементСписка.Значение); |
|||
3
dk
06.03.13
✎
14:45
|
Замени
Excel.ActiveWorkbook.* на НашФайл ---- короче тебе надо разобраться с иерархией объектов в Excel Application - WorkBook - WorkSheet - Cells - ... |
|||
4
samozvanec
06.03.13
✎
14:46
|
там у чего-то есть афигительный метод Выгрузить(), чтоб не бегать по файлу. посмотри в отладчике, у этого чего-то тип будет ComSafeArray. то ли у листа, то ли range надо задать.
а еще не плохо бы ексельку закрывать, ну или тот же ком объект юзать. |
|||
5
dk
06.03.13
✎
14:46
|
и забыть нафиг про все Active... если не требуется выбор пользователем
|
|||
6
YurAnt
06.03.13
✎
15:10
|
Благодарю) все так и есть)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |