среда, 11 мая 2011 г.

из Excel в 1с (Таблица значений)

Leave a Comment

Прочитал статью "Универсальное решение работы с Ексель". И опять чтение происходит путем перебора ячеек листа Ексель. Для больших файлов это очень медленно. Решил просмотреть ВСЕ обработки из рубрики 1С + Excel...

Прочитал статью "Универсальное решение работы с Ексель". И опять чтение происходит путем перебора ячеек листа Ексель. Для больших файлов это очень медленно. Решил просмотреть ВСЕ обработки из рубрики 1С + Excel с целью определить - стоит ли писать о способе чтения Excel файла которым сам пользуюсь.
Итог - почти во всех обработках происходит чтение файла путем перебора каждой ячейки выбранного диапазона листа Ексель. Только в http://infostart.ru/projects/3962/ - использует  вариантный массив, а также чтение с использованием ADO. И то вариантный массив читается поячеечно.
Много обработок с закрытым кодом - о них ничего сказать не могу. 
Но, большинство обработок - законченные решения выполняющие различные функции, а не только ПРОСТОЕ чтение файла. (искренний респект и уважение авторам) Я же предлагаю всего лишь функцию быстрого чтения файла Excel. Готовых обработок в этой области не выкладываю - дублировать существующие нет смысла, или они явно не дотягивают по функционалу до уже выложенных :)
Итак. При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки раз.
Вот текст функции.
Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки 1,НомерПервойКолонки 1ВсегоСтрок 0ВсегоКолонок 0) Экспорт
Если ЛистЭксель = Неопределено Тогда
    
ЛистЭксель ПолучитьCOMОбъект(,"Excel.Application");
КонецЕсли;
Если 
ВсегоСтрок Тогда
    
ВсегоСтрок ЛистЭксель.Cells.SpecialCells(11).Row;
КонецЕсли;
Если 
ВсегоКолонок Тогда
    
ВсегоКолонок ЛистЭксель.Cells.SpecialCells(11).Column;
КонецЕсли;
Если 
ТЗ = Неопределено Тогда
    
ТЗ =  Новый ТаблицаЗначений;
    Для 
Счетчик По ВсегоКолонок Цикл
        
ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
    КонецЦикла;
КонецЕсли;
Для 
Счетчик НомерПервойСтроки По ВсегоСтрок Цикл
    
НоваяСтрока ТЗ.Добавить();
КонецЦикла;

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

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

Комментировать функцию, думаю, нет необходимости. Вот собственно и все, что я хотел сказать. 


0 коммент.:

Отправить комментарий