Имя: Пароль:
1C
1С v8
Можно ли ускорить процесс Импорта значений из Excel
, ,
0 Herber
 
28.07.12
12:28
НомерЛиста         = 1;
 
   
   Попытка
       Excel = новый COMОбъект("Excel.Application");
   Исключение
       Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
   КонецПопытки;    
 
//    Подключились удачно, открываем файл
   Excel.Workbooks.Open("D:/2.xls");
 
//    Открываем необходимый лист
   Excel.Sheets(НомерЛиста).select();  
 
//    Получим количество строк и колонок.
//    В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
   Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
   Если Версия = "8" тогда
       КолСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
       КолКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
   Иначе
       КолСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
       КолКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
   Конецесли;


При переборе строк очень быстро уменьшается быстродействие. Есть ли альтернтива?
1 МихаилМ
 
28.07.12
12:35
2 manyak
 
28.07.12
12:45
до начала работы  отключай обн. экрана и пересчет формул:
excell.Calculation = -4135
excell.screenupdating = false


после окончания включи обратно:
excell.screenupdating = true
excell.Calculation = -4105

значительно ускорит процесс
3 Jaap Vduul
 
28.07.12
12:54
Получать сразу весь массив значений, одним вызовом, без перебора.
4 Агент Инфостарта
 
28.07.12
13:04
(0) Быстрая функция чтения данных с листа Excel http://infostart.ru/public/20090/
5 Herber
 
28.07.12
13:24
(4) Не нашел как передать имя файла
6 Агент Инфостарта
 
28.07.12
13:28
(5) Почитай комментарии, сообразишь как.
7 Herber
 
28.07.12
13:52
(6) Хм.. Нету в комментариях
8 Агент Инфостарта
 
28.07.12
14:01
Есть, просто включи мозг. Если не получиться, значит высокие материи не для тебя.
9 Herber
 
28.07.12
14:09
(8) На той странице ответа не было. Ну да ладно. Гугл помог

Процедура Загрузить()
ПутьКФайлу = "D:\2.xls";  
   Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда
       Предупреждение("Файл не выбран!");
       Возврат;
   КонецЕсли;
   
   Попытка
       Эксель = Новый COMОбъект("Excel.Application");
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;

   Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
   
   Лист = Книга.WorkSheets(1);
   СчитанныйФайл = ПрочитатьЛистExcel(, Лист, 1);
   Эксель.Quit();
   
КонецПроцедуры


Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт

   Если ЛистЭксель = Неопределено Тогда
       ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
   КонецЕсли;
   
   Если ВсегоСтрок = 0 Тогда
       ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
   КонецЕсли;
   
   Если ВсегоКолонок = 0 Тогда
       ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
   КонецЕсли;
   
   Если ТЗ = Неопределено Тогда
       ТЗ =  Новый ТаблицаЗначений;
       Для Счетчик = 1 По ВсегоКолонок Цикл
           ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
       КонецЦикла;
   КонецЕсли;
   
   Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
       НоваяСтрока = ТЗ.Добавить();
   КонецЦикла;

   Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
   Данные = Область.Value.Выгрузить();

   Для Счетчик = 0 По ВсегоКолонок-1 Цикл
       ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
   КонецЦикла;
   
   ЛистЭксель = Неопределено;
   
   Возврат ТЗ;
   
КонецФункции


В ТЗ кроме пустых колонок ничего нету
10 Herber
 
29.07.12
12:16
Апну
11 rs_trade
 
29.07.12
12:17
(0) через адо читай
12 andrey153
 
29.07.12
12:53
Через ado на много быстрей
13 zladenuw
 
29.07.12
13:03
(11) через адо ведь получаем выборку ? а можно сразу выделенные ячейки или нет ?
14 Mashinist
 
29.07.12
13:38
я тоже за ADO
select вернет и нужные колонки и нужные строки
15 Herber
 
29.07.12
15:42
А что быстрее Com или ADO ?
16 Herber
 
29.07.12
15:43
ComArray
17 Jaap Vduul
 
29.07.12
15:57
(15)
По-разному бывает.
Я бы сказал, что сопоставимо.
У ADO преимущества - гибче, не требует наличия MSOffice.
У Com - доступ к оформлению, можно обрабатывать файлы с плохо выраженной табличной структурой.
18 rs_trade
 
29.07.12
18:56
(17) к предыдущему оратору. если просто читать, то адо. причем быстрее на порядок как минимум.
19 zladenuw
 
30.07.12
02:55
тоесть мне в адо нужно построить запрос что бы он вернул готовую тз для обработки или нет ?
примеры только по строковой.
http://www.sql.ru/forum/actualthread.aspx?tid=678251.
а всю область можно или нет ?
20 zladenuw
 
30.07.12
02:57
у меня ексель по 64 к строк и по н страниц. как быть?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn