Процедуры по работе с объектами 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();
    Возврат
СписокЛистов;

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2659    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4594    atdonya    22    

45

Переоткрытие внешних обработок

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

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3953    ke.92@mail.ru    16    

61

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

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

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

28.08.2023    8801    YA_418728146    6    

141

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

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

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

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

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

1 стартмани

13.10.2022    16139    133    sapervodichka    112    

129

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

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

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

18.07.2022    7241    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. rasswet 82 29.04.09 09:15 Сейчас в теме
насколько я понял это не "из документов MSoffice"а сугубо Excel, те. частный случай. верно?
2. acsent 1199 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 1448 02.10.10 10:18 Сейчас в теме
(4) ИМХО второй вариант должен быть быстрее :)
6. пользователь 24.01.12 16:18
Сообщение было скрыто модератором.
...
7. shevelyov 86 27.02.17 10:33 Сейчас в теме
Не понял, чем это лучше метода табличного документа Прочитать(), который "Позволяет считывать табличный документ из файла табличного документа Microsoft Excel 97-2010" и мгновенно загружает весь файл. Посмотрел на год публикации и всё стало понятно :). Вопрос снимаю.
Оставьте свое сообщение