Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Процедуры по работе с объектами MSOffice          
Vofka Подменю пользователя
сообщение 15.06.12, 16:49
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Общий модуль, содержащий процедуры по чтению данных из документов 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();
    Возврат СписокЛистов;

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


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

Спасибо сказали: Batchir, MATEVI, mister-x, shurik_shurik,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 23.04.24, 20:56
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!