Книга знаний

1С:Предприятие / v8 / Приемы программирования / OLE, COM

v8: Быстрый вывод данных в Excel по OLE с помощью COMSafeArray.

Пример быстрого вывода данных в Excel по OLE с помощью COMSafeArray.Автор статьи: ptiz | Редакторы: acsent
Последняя редакция №10 от 23.12.08 | История
URL: http://kb.mista.ru/article.php?id=707

Ключевые слова: Excel, COMSafeArray, вывод, таблица, ADO, select


Объект COMSafeArray  в 1С 8 очень помогает с выводом больших таблиц в Excel.
Тысячи строк выводятся в секунды.

Пример вывода кода и наименования товаров в Excel.


Ексель=Новый COMОбъект("Excel.Application");
Ексель.Workbooks.Add();

Запрос = Новый Запрос("ВЫБРАТЬ
          |    Номенклатура.Код,
          |    Номенклатура.Наименование
          |ИЗ
          |    Справочник.Номенклатура КАК Номенклатура");
ТаблицаРезультата  = Запрос.Выполнить().Выгрузить();

ВсегоСтрок = ТаблицаРезультата.Количество();
ВсегоКолонок = ТаблицаРезультата.Колонки.Количество();

МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоКолонок, ВсегоСтрок);

Для индСтрок = 0 По ТаблицаРезультата.Количество() - 1 Цикл
    
    СтрокаТаблицы = ТаблицаРезультата[индСтрок];
    
    Для индКолонок = 0 По ВсегоКолонок - 1 Цикл
        МассивКОМ.SetValue(индКолонок, индСтрок, СтрокаТаблицы[индКолонок]);
    КонецЦикла; 
    
КонецЦикла; 

Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;    

Ексель.Visible=1; //Делаем Ексель видимым


Еще один вариант с запросом через ADO
Обязательно в строке соединения указывать параметр IMEX=1, иначе некотрые данные в смешаных колонках могут пропадать
    
    СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " +СокрЛП(ИмяФайла) +" ;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";
    
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.ConnectionString =  СтрокаСоединения;
    
    Попытка
        Connection.Open();
    Исключение
        Сообщить ("Проблемы с подключением к Excel" );
        Возврат;
    КонецПопытки;
    
    RS = Новый COMОбъект("ADODB.Recordset");
    
    ТекстЗапроса =
    "SELECT
    |    Лист.*
    |FROM
    |    [Лист1$] as Лист";
    
    попытка
        RS.Open(ТекстЗапроса, Connection);
    исключение
        Сообщить ("Проблемы с выполнением запроса");
        Возврат;
    КонецПопытки;
    
    // Пример обработки полученного recordset
    Соответствие = Новый Соответствие;
    
    Таблица.Очистить();
    Для Счетчик = 1 По RS.Fields.Count Цикл
        Поле = RS.Fields.Item(Счетчик - 1);
        Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
    КонецЦикла;
    
    Пока RS.EOF() = 0 Цикл
        
        НоваяСтрока = Таблица.Добавить();
        
        Для Счетчик = 1 По RS.Fields.Count Цикл
            
            Поле = RS.Fields.Item(Счетчик - 1);
            НоваяСтрока["К" + Счетчик] = Поле.Value;
            
        КонецЦикла;
        
        // Обработка других полей
        RS.MoveNext();
        
    КонецЦикла;
    
    // Завершение работы 
    
    RS.Close();
    Connection.Close();
    
    ЭлементыФормы.Таблица.СоздатьКолонки();
    

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика