Общий модуль, содержащий процедуры по чтению данных из документов MSoffice
v0.5


// Функция получает данные из файла Excel
//
// Параметры:
//   пФайл - Имя файла
//   пЛист - Имя листа с данными
//   СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
//                      если не задано, созадуться колонки вида "К1", "К2"
//
// Возвращаемое значение:
//   ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт

    #Если Клиент Тогда
    Состояние("Установка соединения с Excel");
    #КонецЕсли

    //ЗаголовкиВСтроке1 = "HDR=YES;"
    ЗаголовкиВСтроке1 = "HDR=NO;";

    СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +";Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;""";

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

    Попытка
        Connection.Open();
    Исключение
        Сообщить ("Проблемы с подключением к Excel" );
        Возврат Неопределено;
    КонецПопытки;

    RS = Новый COMОбъект("ADODB.Recordset");

    ТекстЗапроса =
    "SELECT
    |    Лист.*
    |FROM
    |    [" + пЛист + "$] as Лист";

    Попытка
        RS.Open(ТекстЗапроса, Connection);
    Исключение
        Сообщить ("Проблемы с выполнением запроса");
        Возврат Неопределено;
    КонецПопытки;

    Таблица = Новый ТаблицаЗначений;

    Если СтруктураКолонок = Неопределено Тогда

        Для Счетчик = 1 По RS.Fields.Count Цикл
            Поле = RS.Fields.Item(Счетчик - 1);
            Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
        КонецЦикла;

    Иначе

        Для каждого КлючИЗначение Из СтруктураКолонок Цикл
            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
        КонецЦикла;

    КонецЕсли;

    НомерСтроки = 0;
    КолвоСтрок  = RS.RecordCount;

    Пока RS.EOF() = 0 Цикл

        НомерСтроки = НомерСтроки + 1;

        #Если Клиент Тогда
        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
        ОбработкаПрерыванияПользователя();
        #КонецЕсли

        Если НомерСтроки < НачСтрока Тогда
            RS.MoveNext();
            Продолжить;
        КонецЕсли;

        Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
            Прервать;
        КонецЕсли;

        НоваяСтрока = Таблица.Добавить();

        Если СтруктураКолонок = Неопределено Тогда

            Для Счетчик = 1 По RS.Fields.Count Цикл

                Поле = RS.Fields.Item(Счетчик - 1);
                НоваяСтрока["К" + Счетчик] = Поле.Value;

            КонецЦикла;

        Иначе

            Для каждого КлючИЗначение Из СтруктураКолонок Цикл

                Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
                НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;

            КонецЦикла;

        КонецЕсли;

        // Обработка других полей
        RS.MoveNext();

    КонецЦикла;

    // Завершение работы

    RS.Close();
    Connection.Close();

    Возврат Таблица;

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

// Функция получает данные из файла Excel
//
// Параметры:
//   пФайл     - Имя файла
//   пЛист     - Имя листа с данными
//   СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
//                      если не задано, созадуться колонки вида "К1", "К2"
//   XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
//   ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт

    #Если Клиент Тогда
    Состояние("Открытие Excel");
    #КонецЕсли

    Если XLSОбъект = Неопределено Тогда
        XLSОбъект = Новый COMОбъект("Excel.Application");
        XLSОбъект.Visible       = Ложь;
        XLSОбъект.DisplayAlerts = Ложь;
    КонецЕсли;

    Попытка
        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
    Исключение
        Сообщить ("Проблемы с подключением к Excel" );
        Возврат Неопределено;
    КонецПопытки;

    Лист = Book.Sheets(1);
    КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
    КолвоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;

    Таблица = Новый ТаблицаЗначений;

    Если СтруктураКолонок = Неопределено Тогда

        Для Счетчик = 1 По КолвоКолонок Цикл
            Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
        КонецЦикла;

    Иначе

        Для каждого КлючИЗначение Из СтруктураКолонок Цикл
            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
        КонецЦикла;

    КонецЕсли;

    НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
    КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
    КонСтрока = Мин(КонСтрока, КолвоСтрок);

    Для НомерСтроки = НачСтрока По КонСтрока Цикл

        #Если Клиент Тогда
        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока));
        ОбработкаПрерыванияПользователя();
        #КонецЕсли

        НоваяСтрока = Таблица.Добавить();

        Если СтруктураКолонок = Неопределено Тогда

            Для НомерКолонки = 1 По КолвоКолонок Цикл

                Поле = Лист.Cells(НомерСтроки, НомерКолонки);
                НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value;

            КонецЦикла;

        Иначе

            Для каждого КлючИЗначение Из СтруктураКолонок Цикл

                Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение);
                НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;

            КонецЦикла;

        КонецЕсли;

    КонецЦикла;

    XLSОбъект.Application.Quit();
    Возврат Таблица;

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

// Функция получает данные из файла Excel
//
// Параметры:
//   пФайл     - Имя файла
//   пЛист     - Имя листа с данными
//   СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
//                      если не задано, созадуться колонки вида "К1", "К2"
//   XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
//   ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт

    #Если Клиент Тогда
    Состояние("Открытие Excel");
    #КонецЕсли

    Если XLSОбъект = Неопределено Тогда
        XLSОбъект = Новый COMОбъект("Excel.Application");
        XLSОбъект.Visible       = Ложь;
        XLSОбъект.DisplayAlerts = Ложь;
    КонецЕсли;

    Попытка
        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
    Исключение
        Сообщить ("Проблемы с подключением к Excel" );
        Возврат Неопределено;
    КонецПопытки;

    Лист = Book.Sheets(1);
    КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
    КолвоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;

    Таблица = Новый ТаблицаЗначений;

    Если СтруктураКолонок = Неопределено Тогда

        Для Счетчик = 1 По КолвоКолонок Цикл
            Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
        КонецЦикла;

    Иначе

        МаксимальныйНомерКолонки = 0;
        Для каждого КлючИЗначение Из СтруктураКолонок Цикл
            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
            МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
        КонецЦикла;

        КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);

    КонецЕсли;

    НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
    КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
    КонСтрока = Мин(КонСтрока, КолвоСтрок);

    // Массив типа COMSafeArray
    Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
    КолвоСтрок   = Массив.GetUpperBound(1);

    Для НомерСтроки = 1 По КолвоСтрок Цикл

        #Если Клиент Тогда
        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
        ОбработкаПрерыванияПользователя();
        #КонецЕсли

        НоваяСтрока = Таблица.Добавить();

        Если СтруктураКолонок = Неопределено Тогда

            Для НомерКолонки = 1 По КолвоКолонок Цикл

                НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);

            КонецЦикла;

        Иначе

            Для каждого КлючИЗначение Из СтруктураКолонок Цикл

                НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);

            КонецЦикла;

        КонецЕсли;

    КонецЦикла;

    XLSОбъект.Application.Quit();
    Возврат Таблица;

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

// Функция получает список листов Excel
//
// Параметры:
//   пФайл - Имя файла
//   XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
//   СписокЗначений
//
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт

    Если XLSОбъект = Неопределено Тогда
        XLSОбъект = Новый COMОбъект("Excel.Application");
        XLSОбъект.Visible       = Ложь;
        XLSОбъект.DisplayAlerts = Ложь;
    КонецЕсли;

    Попытка
        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
    Исключение
        Возврат Новый СписокЗначений;
    КонецПопытки;

    СписокЛистов = Новый СписокЗначений;
    Для каждого Лист Из XLSОбъект.Sheets Цикл
        СписокЛистов.Добавить(Лист.Name);
    КонецЦикла;

    XLSОбъект.Application.Quit();
    Возврат СписокЛистов;

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


необходимо зарегистрироваться для просмотра ссылки