Category:

Сверхбыстрая загрузка в Excel через ComSafeArray

Как и обещал, демонстрирую, как мгновенно загружается Excel файл с помощью ComSafeArray. Секрет - в выгрузке всего листа, который представляет собой CSA в массив 1С одной командой Выгрузить.

Правда, я еще транспонирую массив, чтобы первым измерением шли строки, вторым - колонки. Так привычнее обрабатывать. Но на это 1С тратит весьма небольшое время по сравнению с выгрузкой CSA в массив (ровно в два раза меньше), так что временем транспонирования можно пренебречь.

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

 


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

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

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


   
Эксель    = New COMObject("Excel.Application");
   
Эксель.visible = false;
   
Книга = Эксель.Workbooks.Open(ИмяФайла);

    Для
НомерЛиста = 1 To Книга.Sheets.Count Цикл
       
Лист = Книга.Sheets(НомерЛиста);
       
ИмяЛиста = Лист.Name;
        Если
СоответствиеФильтраЛистов <> Неопределено Тогда
            Если
СоответствиеФильтраЛистов[НомерЛиста] = Неопределено
                И
СоответствиеФильтраЛистов[ИмяЛиста] = Неопределено
            Тогда
                Продолжить;
//Если лист грузить не надо
           
КонецЕсли;
        КонецЕсли;

       
КоличествоСтрок = Лист.UsedRange.Rows.Count;
       
КоличествоКолонок = Лист.UsedRange.Columns.Count;


       
CSAМассив= Лист.Range(Лист.Cells(1, 1), Лист.Cells(КоличествоСтрок, КоличествоКолонок)).Value;
       
//ОбщееКоличествоКолонок     = CSAМассив.GetUpperBound(0);
        //ОбщееКоличествоСтрок     = CSAМассив.GetUpperBound(1);
       
ЯчейкиВыгруженные CSAМассив.Выгрузить();


       
//Транспонирование, все же привычнее, чтобы в первом измерении были строки, а в колонках-колонки.
       
Ячейки = Новый Массив(КоличествоСтрок, КоличествоКолонок);
        Для
Строка = 1 По КоличествоСтрок Цикл
            Для
Колонка = 1 По КоличествоКолонок Цикл
               
Ячейки[Строка - 1][Колонка - 1] = ЯчейкиВыгруженные[Колонка - 1][Строка - 1];
            КонецЦикла;
        КонецЦикла;

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

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

    КонецЦикла;

   
Книга.Close();

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



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

promo fixin december 31, 2037 16:57 1420
Buy for 30 tokens
UPD: Друзья, в августе 2019 года блог переехал на http://fixinchik.ru. Welcome! Добро пожаловать в журнал Осипова Сергея Александровича, известного также как Fixin и Гений 1С. Рекомендую ознакомиться с Часто Задаваемыми Вопросами обо мне. Что я хочу в подарок - список. Мой проект "…