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

01.10.10

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

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

Скачать файл

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

Наименование Бесплатно
-
.1240827916 13,42Kb
1144
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С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    22078    dimanich70    81    

147

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

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

1 стартмани

18.03.2024    4244    3    John_d    11    

57

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

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

12.02.2024    20934    atdonya    25    

58

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

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

30.11.2023    5718    ke.92@mail.ru    17    

65

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

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

28.08.2023    15488    YA_418728146    7    

169

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

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

2 стартмани

22.08.2023    3772    59    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18768    174    sapervodichka    112    

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