COMОбъект ("Excel.Application"); #397695


#0 by viktorovichvadim
Подскажите, кто работал с методами экселя: Например, имеется огромное число файлов Excel Задача: нужно перебрать все файлы в каталоге, зайти в каждый из них и считать информацию из нужной ячейки. Работает очень медленно. Если выкидываю строку XL = Новый ComОбъект("Excel.Application"); перед циклом, работает несколько быстрее, но все равно не так как хотелось бы. возможно, я как-то неправильно использую методы Excelя и можно изменить код и этим реально увеличить скорость обработки?
#1 by ТелепатБот
#2 by ДенисЧ
сом - он вообще не быстрый...
#3 by Rie
Не надо открывать/закрывать Excel для каждого файла. Можно просто закрывать книгу.
#4 by viktorovichvadim
напиши как - я не силен в excel
#5 by Rie
Книга.Close
#6 by viktorovichvadim
в начале цикла должна соответствовать строка закрытия файла ТекФайлXLS.ПолноеИмя в конце цикла, т.к. видимо в екселе продолжают висеть открытые в предыдущих шагах цикла файлы. подскажите, как это сделать. :-) спасибо Rie, пока я писал сообщение - пришел ответ. буду сейчас тестировать
#7 by viktorovichvadim
не помогает. с каждой секундой excel жрет больше и больше памяти
#8 by Rie
Сейчас цикл выглядит так?
#9 by Fragster
а зачем каждый раз новый ком объект создавать? ИМХО гарбаж коллектор не успевает гoвно за этим кодом убирать... надо всем начинающим программистам в сях тренироваться с маллоком - может тогда и понимать что-нить начнут...
#10 by Fragster
+111!
#11 by viktorovichvadim
у меня XL.Quit перед окончанием цикла, а не после него, а остальное так
#12 by viktorovichvadim
com создаю только один раз.
#13 by Fragster
+ тока можно еще Книга = 0; и XL = 0 вставить в соответствующие места
#14 by Rie
Убери XL.Quit из цикла. В цикле - только читаешь из Excel или что-то туда пишешь?
#15 by Rie
Если создаёшь какие-то переменные, ссылающиеся на листы, ячейки и т.д. - зануляй их, как сказано в , внутри цикла (кроме самого XL, разумеется - он будет нужен до окончания цикла)
#16 by vde69
советую перейти на ADO и проблемм не будет
#17 by viktorovichvadim
вроде так все и делаю, а смотрю в момент выполнения кода на процессы - эксель продолжает увеличивать пожираемую память..
#18 by Rie
Через несколько итераций выводи посмотри значение XL.Workbooks.Count - может, книги всё же не закрываются? Или воспользуйся .
#19 by viktorovichvadim
Книги закрываются, не могу понять, почему жрет память?
#20 by Rie
Что значит "жрёт память"?
#21 by smaharbA
может немного смягчит
#22 by viktorovichvadim
что такое 0, -1 жрет память - смотрю в диспетчере задач, процессы, excel.exe, в колонке память постоянно увеличивается значение (сейчас, например 146 000 Кб)
#23 by viktorovichvadim
я, наверное, уже надоел, но почему все-таки такая фигня?
#24 by viktorovichvadim
ни разу не смягчает
#25 by viktorovichvadim
люди, помогите...
#26 by Fragster
может, пауза поможет?
#27 by Fragster
ну, и экстремальный вариант scr = СоздатьОбъект("WScript.Shell");
#28 by viktorovichvadim
пауза позволит снизить нагрузку на память, но как может от этого увеличиться скорость
#29 by viktorovichvadim
прошу помочь.
#30 by Fragster
на процессор. гарбадж коллектору время даем.
#31 by Fragster
+ да и не скорость увеличиваем, а памяти потребление уменьшаем... по крайней мере мне так казалось..
#32 by viktorovichvadim
не помогает...
#33 by Fragster
а кроме этого кода есть что-нить еще, что с XL работает?
#34 by viktorovichvadim
нет
#35 by Torquader
Память будет "жраться" из-за того, что Excel открывает книги. При этом, если даже книгу тут же закрывают, то "умный" Excel не сразу освобождает память. Также надо понимать, что OLE - очень медленная система. Поэтому, проще выбор написать в сценарии Excel, в Workbook_OnOpen в специальной книге, которую будут вызывать при открытии, а уже из этой книги можно будет перебрать все файлы Excel, так как всё это будет исполняться в рамках одного процесса и без торможений OLE при вызове RPC-методов. Попробуйте - разница очень ощутима.
#36 by akostrov
Попробуй через ADO
#37 by akostrov
#38 by smaharbA
для успокоения можешь создавать все время новый объект точно не будет "жрать"
#39 by smaharbA
Вот только в восьмерке евал вроде както не так возврат делает
#40 by viktorovichvadim
благодарю всех, завтра попробую все способы. потом отпишу, что получилось
#41 by viktorovichvadim
как на vba в ексель будет выглядеть макрос, который выбирает .xls - файлы из указанного каталога, заходит в каждый и считывает например значение ячейки А1? че то второй день пытаюсь написать (я мало знаком с vba), но без толку. Подскажите, кто в теме
#42 by viktorovichvadim
что, никто не в теме? или еще не проснулись?
#43 by smaharbA
do while файл<>"" файл=dir loop но - Зачем ? (с)
#44 by viktorovichvadim
хочу проверить совет  Torquader а можно подробнее я что-то в коде не наблюдаю как открываются файлы эксель, и с соответствующего листа из соответствующей ячейки берется нужное значение. к тому же xl файлы нужно выбирать из всех подкаталогов данного каталога
#45 by smaharbA
ну это извините, Вы просили перебор - получите - распишитесь если все паришься с заемом памяти делай и не парься, если евал возвращает строку то и это решается за недорого
#46 by hhhh
ты попробуй вручную открыть 30 или 40 файлов - быстро они у тебя будут открываться или медленно?
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С