helpf.pro
Регистрация
 0 
Распечатать

Подключение к EXCEL и чтение данных из листа Excel

Код 1C v 8.х
 Ex = Новый COMObject("Excel.Application");
   Ex.Workbooks.Open(Путь);
   Ex.Visible = 1;    
   ТекЛист=Ex.WorkSheets(1);        
   Для Ячейка = 1 по 400 цикл
       Если НЕ  ТекЛист.Cells(Ячейка,1).Value  = Неопределено тогда
           Сообщить(Строка(ТекЛист.Cells(Ячейка,1).Value));    
           Карта = Справочники.Номенклатура.НайтиПоКоду(ИзЧислаВСтроку(ТекЛист.Cells(Ячейка,1).Value));    
           Если Карта.Пустая() тогда        
               Сообщить(" Пустой элемент "  + ТекЛист.Cells(Ячейка,1));
           иначе
               Объект = Карта.ПолучитьОбъект();
               Объект.ОсновнойПоставщик = ОсновнойКлиент;
               Объект.Записать();
               конецесли;    
       конецесли;
   конеццикла;     


Примеры процедур для чтения данных из EXCEL

Код 1C v 8.х
 
// Функция получает данные из файла 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");

    ТекстЗапроса =
    "S_elect
    |    Лист.*
    |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();
    Возврат СписокЛистов;

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


Код 1C v 7.x
 Попытка
  Excel = СоздатьОбъект("Excel.Application");
 Исключение
  Сообщить(ОписаниеОшибки()+"; программа Excel не установлена на данном компьютере!");
     Возврат;
 КонецПопытки;
РабочиеКниги=Excel.WorkBooks;  // создаем рабочую книгу

 Попытка // открываем файл
  Отчет=РабочиеКниги.Open(Каталог+ИмяФайла); 
 Исключение 
  Сообщить(ОписаниеОшибки()+"; фаил с макросом не найден!");
  Возврат;
 КонецПопытки;

// заносим в таблицу какие-либо данные

 Лист = Отчет.Worksheets(1);

 Для Ном=1 По 20 Цикл
      Ячейка = Лист .Cells(ном,1); Ячейка.Value;
      Сообщить(Ячейка );
 КонецЦикла; 

Excel.Visible=1;

Попытка
      Отчет.Save();
Исключение
     Сообщить(ОписаниеОшибки()+"; не могу сохранить отчет!");
  Возврат;
 КонецПопытки;
Разместил:   Версии: | 7.x | 8.x |  Дата:   Прочитано: 106042
 0 
Распечатать
Возможно, вас также заинтересует
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C медленно работает по сети с базой на SQL Server 23
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1Cv8.1CD - Файл данных достиг максимального размера! 9
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Посмотреть все результаты поиска похожих
Комментарии
vitfree
30.12.2012 15:01Комментарий: 1
vitfree
это универсальный код, он будет работать в 1с 8.2 УТ11?
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!