gifts2017

Решение проблемы медленного чтения из Excel при больших объемах

Опубликовал Сергей Коновалов (r-america) в раздел Обмен - Загрузка и выгрузка в Excel

При чтении из Excel файлов большого объема 1С "тормозит".  Есть различные решения этой проблемы, но все они сложные. А ларчик просто открывается! Предлагается очень простое решение, проверенное практикой.

В 1С широко применяется Excel для интеграции с другими хранилищами данных и системами. В частности при импорте прайсов поставщиков. А поскольку прайсы бывают по нескольку десятков тысяч строк, то скорость импорта вызывала раздражение пользователей. Совсем недавно удалось решить эту проблему гораздо проще, чем предлагается другими авторами. Итак код, а потом комментарии.

Excel=СоздатьОбъект("Excel.Application");
Excel.Workbooks.Open(Файл);
Excel.Worksheets(1).Activate();
........................
........................

MaxRow=Excel.Cells(1,1).SpecialCells(11).Row;
MaxCol=Excel.Cells(1,1).SpecialCells(11).Column;

Пока Row
    СтрокаИзExcel= Excel.Range(Excel.Cells(Row,1), Excel.Cells(Row,MaxCol));
    ..........................
    ЗначениеЯчейки1=СтрокаИзExcel.Cells(1,НомерКолонкиДляЧтения1).Value;
    ЗначениеЯчейки2=СтрокаИзExcel.Cells(1,НомерКолонкиДляЧтения2).Value;
    ЗначениеЯчейки3=СтрокаИзExcel.Cells(1,НомерКолонкиДляЧтения3).Value;
    ............................
    ............................
    Row=Row+1;
КонецЦикла;

Как видите, сначала читается строка из документа, а уже значения конкретных ячеек зачитываются из строки, представленной как диапазон (Range). Это позволяет Excel не осуществлять зачитывание данных из файла отдельно каждый раз, когда программа читает отдельные ячейки из строки. В результате скорость чтения вырастает в разы. Во сколько конкретно? Если вы читали по 10 ячеек в каждой строке, то вырастает в 9 раз, а если читали всего две, то в 2 раза! Я не пробовал, но по логике вещей, то и запись можно сделать аналогично, сначала создать строку через Range, а затем прописывать значения ячеек уже в строку.

См. также

Подписаться Добавить вознаграждение
Комментарии
0. Сергей Коновалов (r-america) 02.03.12 00:39
При чтении из Excel файлов большого объема 1С "тормозит". Есть различные решения этой проблемы, но все они сложные. А ларчик просто открывается! Предлагается очень простое решение, проверенное практикой.

Перейти к публикации

1. leles 02.03.12 00:39
За поиск непростых путей +, ведь мы их ищем!
Но мне кажется, так будет быстрее:

Функция ПрочитатьФайл(ПутьКфайлу)
	Попытка
		Эксел = Новый COMОбъект("Excel.Application");
	Исключение
		Сообщить("" + ОписаниеОшибки() + " Программа Exсel не установлена на этом компьютере!");
   		Возврат Неопределено;
	КонецПопытки;	
	Эксел.Visible = Ложь;
	Книга = Эксел.Workbooks.Open(ПутьКфайлу);
	Лист = Книга.WorkSheets(1);
	ПоследняяЯчейка = Лист.Cells.SpecialCells(11);
	ВсегоСтрок = ПоследняяЯчейка.Row;
	ВсегоКолонок = ПоследняяЯчейка.Column;
	Данные = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value.Выгрузить();
    Таблица = Новый ТаблицаЗначений;
	Для i = 0 По ВсегоКолонок - 1 Цикл
		Таблица.Колонки.Добавить("К" + i, Новый ОписаниеТипов("Строка")); // или Число, или без описания  
	КонецЦикла;
	Для i = 1 По ВсегоСтрок Цикл
    	НоваяСтрока = Таблица.Добавить();
	КонецЦикла;
	Для i = 0 По ВсегоКолонок - 1 Цикл
    	Таблица.ЗагрузитьКолонку(Данные[i], i);
	КонецЦикла;
	Книга.Close(0);
	Эксел.Quit();
	Эксел = Неопределено;
	Возврат Таблица;
КонецФункции
...Показать Скрыть


А потом в запрос её, и давай плющить да на полоски распускать :)
dour-dead; +1 Ответить
3. Юрий Осипов (yuraos) 08.02.13 12:46
Плюс за смекалку.
Еще больший выигрышь получается при доступе к файлу Excel через ADO.
Статей по этому поводу масса.
Могу также порекомендовать свои скромные наработки.
Исходники подсистемы описаны тут.
4. Евгений Фамилия (internetname) 08.02.13 13:07