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

01.10.10

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

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

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
-
.1240827916 13,42Kb
1146 Скачать бесплатно


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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    2950    Abysswalker    7    

43

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    5798    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    47297    dimanich70    83    

167

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    7069    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    58778    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8806    ke.92@mail.ru    17    

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