Загрузка из Excel через ADO

топ 100 блогов fixin12.05.2016

Завершаю триптих кодом, как загружать в Excel из ADO.

Плюсы - в том что на компьютере, где используется загрузка через ADO не требуется быть в наличии Excel. Скорость очень большая, быстрее, чем чере COM. Ну и в целом, универсальный механизм.

Минусы - ADO не переваривает файлы с большим количеством колонок. Не работает простым образом под Linux, т.к. все же использует COM-объекты.

Код функции под катом.

Загрузка из Excel через ADO

 




Функция ЗагрузитьExcelФайлВМассивЛистовЧерезAdo(ИмяФайла, ЗНАЧ СоответствиеФильтраЛистов = Неопределено)
    //СоответствиеФильтраЛистов - соответствие содержащее числа с номерами листа (начиная с единицы)
    //Или названия листов в виде строки.
    //Возвращается массив структур с полями:
    //  Номер - номер листа с единицы
    //  Имя - имя листа строкой
    //  Строк - количество строк
    //  Колонок - количество колонок
    //  Ячейки - двумерный массив колонок, первое измерение - строка, второе - колонка

    Перем МассивЛистов;

    МассивЛистов = Новый Массив(); //Это массив листов


    АДОСоединение=Новый COMОбъект("ADODB.Connection");

    //РазделителиЧастейЧисла=".,";

    АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;""";
    //АДОСоединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(Родитель.ИмяФайла)+";Extended Properties=""Excel 8.0;""";
    АДОСоединение.Open();

    АДОКаталог = Новый COMОбъект("ADOX.Catalog");
    АДОКаталог.ActiveConnection = АДОСоединение;




    НомерЛиста = 0; //Листов может быть меньше таблиц за счет видов View
    Для iCount = 0 По АДОКаталог.Tables.Count-1 Цикл
        Если АДОКаталог.Tables.Item(iCount).Type = "VIEW" Тогда
            Продолжить;
        КонецЕсли;
        НомерЛиста = НомерЛиста + 1;

        ИмяИсходное = АДОКаталог.Tables.Item(iCount).Name;
        ИмяЛиста = ИмяИсходное;
        Если Прав(ИмяЛиста,1)="'" Тогда
            ИмяЛиста=ЛЕВ(ИмяЛиста, СтрДлина(СокрЛП(ИмяЛиста))-1);
        КонецЕсли;
        Если Прав(ИмяЛиста,1)="$" Тогда
            ИмяЛиста=ЛЕВ(ИмяЛиста, СтрДлина(СокрЛП(ИмяЛиста))-1);
        КонецЕсли;
        Если Лев(ИмяЛиста,1)="'" Тогда
            ИмяЛиста=Сред(ИмяЛиста, 2);
        КонецЕсли;

        Если СоответствиеФильтраЛистов <> Неопределено Тогда
            Если СоответствиеФильтраЛистов[НомерЛиста] = Неопределено
                И СоответствиеФильтраЛистов[ИмяЛиста] = Неопределено
                Тогда
                Продолжить; //Если лист грузить не надо
            КонецЕсли;
        КонецЕсли;

        АДОЗапись = Новый COMОбъект("ADODB.Recordset");
        АДОЗапись.ActiveConnection = АДОСоединение;
        АДОЗапись.CursorType = 0;
        АДОЗапись.LockType = 1;
        АДОЗапись.Open("Select * from ["+ ИмяИсходное +"]");

        КоличествоКолонок = АДОЗапись.Fields.Count;

        Ячейки = Новый Массив();
        Стр = 0;
        АДОЗапись.MoveFirst();
        Пока АДОЗапись.EOF() = 0 Цикл
            Стр = Стр + 1;
            МассивСтроки = Новый Массив(КоличествоКолонок);
            Ячейки.Добавить(МассивСтроки);
            Для Кол = 1 ПО КоличествоКолонок Цикл
                МассивСтроки[Кол - 1] = АДОЗапись.Fields(Кол-1).Value;
            КонецЦикла;
            АДОЗапись.MoveNext();
        КонецЦикла;

        КоличествоСтрок = Стр;

        АДОЗапись.Close();


        СтруктураЛиста = Новый Структура();
        СтруктураЛиста.Вставить("Строк", КоличествоСтрок);
        СтруктураЛиста.Вставить("Колонок", КоличествоКолонок);
        СтруктураЛиста.Вставить("Ячейки", Ячейки);
        СтруктураЛиста.Вставить("Номер", НомерЛиста);
        СтруктураЛиста.Вставить("Имя", ИмяЛиста);

        МассивЛистов.Добавить(СтруктураЛиста);

    КонецЦикла;

    АДОСоединение.Close();

    Возврат МассивЛистов;



КонецФункции

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

Архив записей в блогах:
с ...
Добрый вечер всем. Очередной обструктивный бронхит у ребенка наводит меня на мысль, что было бы хорошо свозить его на море. Рассматриваем Крым, конец мая - начало июня. Но я последний раз была в Крыму 15 лет назад и совсем не представляю как там сейчас. Реально ли снять что-то типа ...
Во всех Нельзяграмах страны скоро уже началась подготовка к Новому Году. Главному празднику страны, как внушают нам в рекламе. Погоды установились вполне новогодние. Даже более, чем - учитывая, что в декабре у нас в Питере обычно теплее, чем было в последние дни. В ноябре выпала месячная ...
Целями с помощью аудиокассет, а остальные члены команды обслуживали все бортовые системы, включая разборку, ремонт и сборку единственной торпеды Мк-48, оставшейся на подводной лодке. Там находились многочисленные счета, списки, письма и ...
...