Процедуры по работе с объектами MSOffice

01.10.10

Разработка - Универсальные функции

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

Скачать файлы

Наименование Файл Версия Размер
-
.1240827916 13,42Kb
1144
.1240827916 13,42Kb 1144 Скачать бесплатно


// Функция получает данные из файла 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();
    Возврат
СписокЛистов;

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

См. также

Печать любых непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать любые печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

3480 руб.

22.08.2023    787    1    0    

1

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    3026    YA_418728146    3    

84

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    13186    100    sapervodichka    106    

118

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    6312    quazare    8    

103

Хитрости СКД. Часть 3

СКД Универсальные функции Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    7652    milkers    11    

87

Базовые принципы работы с регламентными заданиями подсистем БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В очередной публикации рассмотрим некоторые базовые приемы работы с регламентными заданиями в рамках библиотеки стандартных подсистем

22.05.2022    12346    quazare    25    

57
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. rasswet 82 29.04.09 09:15 Сейчас в теме
насколько я понял это не "из документов MSoffice"а сугубо Excel, те. частный случай. верно?
2. acsent 1190 29.04.09 09:51 Сейчас в теме
(1) Модуль находится в процессе разработки (по мере необходимости).
Таки да, пока только Excel
3. ZERO_ 63 29.04.09 11:29 Сейчас в теме
Ну, вещь, в принципе, нужная, но.... Если бы на годик раньше... (Мне бы, лично, пригодилось)... И функционала бы побольше...
4. rasswet 82 02.09.09 13:11 Сейчас в теме
в чем разница между
Excel_ПолучитьДанные_COM
Excel_ПолучитьДанные_COMArray
?
sashs1980; +1 Ответить
5. artbear 1437 02.10.10 10:18 Сейчас в теме
(4) ИМХО второй вариант должен быть быстрее :)
6. пользователь 24.01.12 16:18
Сообщение было скрыто модератором.
...
7. shevelyov 86 27.02.17 10:33 Сейчас в теме
Не понял, чем это лучше метода табличного документа Прочитать(), который "Позволяет считывать табличный документ из файла табличного документа Microsoft Excel 97-2010" и мгновенно загружает весь файл. Посмотрел на год публикации и всё стало понятно :). Вопрос снимаю.
Оставьте свое сообщение