воскресенье, 1 июля 2012 г.

Чтение из Excel в 1С8


Функция ПрочитатьФайлЭксель(ПутьКФайлу) Экспорт 
    
    //Создание объекта для установки связи с источником данных 
    Connection = Новый COMОбъект("ADODB.Connection");
    //сформируем строку подключения 
    //Если необходимо в дальнейшем оперировать цифровыми значениями колонок,то ставим признак HDR = NO 
    //если необходимо производить загрузку с учетом псевдонимов в 1й строке,то ставим HDR = YES 
    СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+ПутьКФайлу;
    СтрокаПодключения = СтрокаПодключения + "; Extended Properties = "+"""Excel 8.0"+";HDR=NO;IMEX=1"";";
    //подключение к источнику данных 
    Попытка
        Connection.Open(СтрокаПодключения);
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;    
    
    //создание объекта выполнения команды 
    Command = Новый COMОбъект("ADODB.Command");
    //создание объекта подключения к файлу 
    axCatalog = Новый COMОбъект("ADOX.Catalog"); 
    axCatalog.ActiveConnection = Connection; 
    //получим листы документа, 
    //для обработки колонок листа можно обратится к коллекции Лист.Columns,которую тоже можно обойти посредством цикла Для каждого  

    СписокЛистов = Новый СписокЗначений;
    КоличествоКолонок = 0;
    Для каждого Лист ИЗ axCatalog.Tables Цикл
        
        ТекстЗапросаКолонки = "";
        Если Лист.Columns.Count() > 5 Тогда
            Для к = 1 По Лист.Columns.Count() Цикл
                ТекстЗапросаКолонки = ТекстЗапросаКолонки + ?(ТекстЗапросаКолонки="","F"+Формат(к,"ЧЦ=15; ЧГ=0"),",F"+Формат(к,"ЧЦ=15; ЧГ=0"));    
            КонецЦикла;
            СписокЛистов.Добавить(Лист.Name,ТекстЗапросаКолонки);
            КоличествоКолонок = к - 1;
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    
    //Создание объекта набора записей 
    RecordSet = Новый COMОбъект("ADODB.RecordSet");
    //Указание активного соединения 
    Command.ActiveConnection = Connection;
    //получим количество строк в документе 
    Command.CommandText = "SELECT COUNT(*)FROM ["+СписокЛистов[0].Значение+"]";
    //определение типа команды 
    Command.CommandType = 1;
    //Выполнение и получение набора данных 
    RecordSet = Command.Execute();
    //первая запись это количество 
    КоличествоСтрок = RecordSet.Fields(0).Value;
    //опредлеление текста команды 
    Command.CommandText = "SELECT "+СписокЛистов[0].Представление+" FROM ["+СписокЛистов[0].Значение+"]";
    //определение типа команды 
    Command.CommandType = 1;
    
    //Выполнение и получение набора данных 
    Попытка 
        RecordSet = Command.Execute();
    Исключение 
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("Дата"));
    МассивТипов.Добавить(Тип("Строка"));
    МассивТипов.Добавить(Тип("Число"));
    МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
    
    ОписаниеТипов = Новый ОписаниеТипов(МассивТипов,Новый КвалификаторыЧисла(15,2),Новый КвалификаторыСтроки(100),Новый КвалификаторыДаты(ЧастиДаты.Дата));
    
    ТаблицаЗагрузки = Новый ТаблицаЗначений;
    Колонки = ТаблицаЗагрузки.Колонки;
    Для к = 1 По КоличествоКолонок Цикл
        Колонки.Добавить("F" + Формат(к,"ЧЦ=15; ЧГ=0"),ОписаниеТипов);
    КонецЦикла;
    
    RecordSet.MoveNext();//т.к первая строка это заголовки таблиц,не будем ее учитывать 
    Пока RecordSet.EOF() = 0 Цикл
        НоваяСтрока = ТаблицаЗагрузки.Добавить();
        к = 0;
        Для каждого Колонка ИЗ ТаблицаЗагрузки.Колонки Цикл
            НоваяСтрока[Колонка.Имя] = СокрЛП(Строка(RecordSet.Fields(к).Value));
            к = к+1;
        КонецЦикла;
        RecordSet.MoveNext();
    КонецЦикла;
    
    //Колонки.Добавить("Нпп" ,Новый ОписаниеТипов("Дата,Строка,Число",Новый КвалификаторыЧисла(15),Новый КвалификаторыСтроки(100),Новый КвалификаторыДаты(ЧастиДаты.Дата))); 
     
    Возврат ТаблицаЗагрузки;
    
    RecordSet.Close();    
    
    Connection.Close();
    
КонецФункции

Комментариев нет:

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