|
Загрузка из множества эксель файлов, подскажите в чем косяк | ☑ | ||
---|---|---|---|---|
0
murzo1
13.12.11
✎
10:03
|
НайденныеФайлы = НайтиФайлы("C:\Aojama\ЭКСЕЛЬ\подбор", "*.xls", Истина);
Для Каждого ИмяФайла Из НайденныеФайлы Цикл ОбработкаПрерыванияПользователя(); ВыбФайл = Новый Файл(ИмяФайла.ПолноеИмя); СправочникСсылка = Справочники.Автоработы.НайтиПоНаименованию(ВыбФайл.ИмяБезРасширения); Если НЕ ЗначениеЗаполнено(СправочникСсылка) Тогда СправочникОбъект = Справочники.Автоработы.СоздатьЭлемент(); СправочникОбъект.Наименование = ВыбФайл.ИмяБезРасширения; СправочникОбъект.Номенклатура = Справочники.Номенклатура.Авторабота; СправочникОбъект.УстановитьНовыйКод(); СправочникОбъект.ОбменДанными.Загрузка = Истина; СправочникОбъект.Записать(); Сообщить(СправочникОбъект); НомерЛиста = 1; Excel = Новый COMОбъект("Excel.Application"); Excel.Workbooks.Open(ВыбФайл.ПолноеИмя); Excel.Sheets(НомерЛиста).Select(); ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Для Строка = 1 По ФайлСтрок Цикл Если Найти("1234567890", СокрЛП(Excel.Cells(Строка, 2).Value)) > 0 Тогда КатНомер = СокрЛП(Excel.Cells(Строка, 1).Value); Количество = СокрЛП(Excel.Cells(Строка, 2).Value); НомСсыл = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", КатНомер); НаборЗаписей = РегистрыСведений.СвязанныеРаботы.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Авторабота.Установить(СправочникОбъект.Ссылка); НаборЗаписей.Отбор.СвязаннаяРабота.Установить(НомСсыл); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() = 0 Тогда НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Авторабота = СправочникОбъект.Ссылка; НоваяЗапись.СвязаннаяРабота = НомСсыл; НоваяЗапись.Количество = Число(Количество); ИначеЕсли НаборЗаписей.Количество() = 1 Тогда СтараяЗапись = НаборЗаписей[0]; СтараяЗапись.Авторабота = СправочникОбъект.Ссылка; СтараяЗапись.СвязаннаяРабота = НомСсыл; СтараяЗапись.Количество = Число(Количество); КонецЕсли; Попытка НаборЗаписей.Записать(); Сообщить("записано"); Исключение Сообщить("найхуа"); КонецПопытки; КонецЕсли; КонецЦикла; Excel.ActiveWorkbook.Close(); Excel.Quit(); КонецЦикла; При загрузке почемуто виснет.... в чем может быть ошибка? |
|||
1
vmv
13.12.11
✎
10:06
|
слишком много точек в объектных переменным и сом, начни с малого
перед началом всех начал напиши МенеджерАвтоработы = Справочники.Автоработы; и т.д. |
|||
2
dk
13.12.11
✎
10:08
|
замер производительности запретили?
|
|||
3
vmv
13.12.11
✎
10:08
|
+ но тормозит изза записи набора регистра в цикле и
НаборЗаписей = РегистрыСведений.СвязанныеРаботы.СоздатьНаборЗаписей(); тоже вынести за цикл. зачем создавать переменную набора каждый раз в цикле, если ее(набор) можно объявить перед заходом в цикл и потом работать с отборами по этому набору |
|||
4
dk
13.12.11
✎
10:09
|
да и эксель нафига в цикле создавать?
много лишней требухи в цикле |
|||
5
murzo1
13.12.11
✎
10:11
|
(3) файлы не стандартизированные и только в цикле можно определить какая строка подходит, поэтмоу в цикле и делаю
|
|||
6
vmv
13.12.11
✎
10:12
|
Excel = Новый COMОбъект("Excel.Application");
тоже в цикле, о боже да вынеси все объявления переменных в том числек и ком за циклы - это еще в школе учат и посмотри процессы когда сей код колбасит, удивишься количеству процессов эксель) |
|||
7
vmv
13.12.11
✎
10:12
|
(5) это не аргумент, тем более он беспочвенный и неверный
|
|||
8
murzo1
13.12.11
✎
10:13
|
(7) как ты определишь с какой строки загружать ? )
|
|||
9
vmv
13.12.11
✎
10:14
|
Excel = Новый COMОбъект("Excel.Application");
самая тормознутая строка в этом коде и если у тебя 100 файлов, то 100 раз происходит инициализация сом, а только одна инициализация его иногда напрягает ожиданием |
|||
10
murzo1
13.12.11
✎
10:21
|
Виснет на этой встрочке: Excel.ActiveWorkbook.Close();
|
|||
11
dk
13.12.11
✎
10:28
|
(10)
1. в open надо указать, что только на чтение 2. в close сказать, что не сохранять |
|||
12
vmv
13.12.11
✎
10:37
|
Состояние("Создание COMОбъект(<Excel.Application>)");
Excel = Новый COMОбъект("Excel.Application"); Для каждого ТекущийФайл Из мФайлы Цикл //..... Excel.DisplayAlerts = 0; // запрещаем вывод на экран ExcelBooks = Excel.Workbooks.Open(ИмяФайлаИмпорта); // открываем книгу Excel.ActiveWorkbook.RunAutoMacros(1); // отключаем макросы КоличествоЛистов = ExcelBooks.Sheets.Count; //.... ТекущийЛист = Excel.Sheets(НомерЛиста); ИмяТекущегоЛиста = ExcelBooks.Sheets(НомерЛиста).Name; ВсегоКолонок = ТекущийЛист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = ТекущийЛист.Cells(1,1).SpecialCells(11).Row; //.... //.... //ExcelBooks.Saved = Истина; //ExcelBooks.Saved = Ложь; ExcelBooks.Close(); КонецЦикла; |
|||
13
murzo1
13.12.11
✎
11:00
|
(12) спасибо, помогло
|
|||
14
murzo1
13.12.11
✎
12:08
|
НайденныеФайлы = НайтиФайлы("C:\Aojama\ЭКСЕЛЬ\подбор", "*.xls", Истина);
НомерЛиста = 1; Excel = Новый COMОбъект("Excel.Application"); Для Каждого ИмяФайла Из НайденныеФайлы Цикл ОбработкаПрерыванияПользователя(); ВыбФайл = Новый Файл(ИмяФайла.ПолноеИмя); СправочникСсылка = Справочники.Автоработы.НайтиПоНаименованию(ВыбФайл.ИмяБезРасширения); Excel.DisplayAlerts = 0; ExcelBooks = Excel.Workbooks.Open(ВыбФайл.ПолноеИмя); Excel.ActiveWorkbook.RunAutoMacros(1); Для КолВаЛистов = 1 По Excel.Sheets.Count Цикл Excel.Sheets(КолВаЛистов).Select(); ФайлСтрок = Макс(Excel.Cells.CurrentRegion.Rows.Count, 13); ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); может еще подскажие почему не получается по всем листам пробежатся? ошибка вылазит По первому листу проходит нормально, а потом падает.... |
|||
15
dk
13.12.11
✎
12:12
|
стиль корявый
соблюдай иерархию application workbook sheet cells/range т.е. нежелательно обращаться к нижестоящему уровню не указав вышестоящий |
|||
16
dk
13.12.11
✎
12:13
|
да и Cells.CurrentRegion - что-то новенькое, отродясь пользовались usedrange и specialcells
|
|||
17
murzo1
13.12.11
✎
12:16
|
(16) спасибо за инфу
|
|||
18
dk
13.12.11
✎
12:25
|
пробежаться по листам
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |