Excel создатьобъект excel application

Чтение данных из Excel

Доступ из 1С к Excel производится посредством OLE. Создание COM-объекта:

Попытка
     Эксель = СоздатьОбъект(“Excel.Application”);
Исключение
     Сообщить(ОписаниеОшибки());
     Возврат;
КонецПопытки;

Теперь используя переменную Эксель можно управлять приложением Excel.

  • Внимание! Microsoft Excel должен быть установлен на компьютере!

Следующая команда откроет книгу:

 Книга = Эксель.WorkBooks.Open(ПутьКФайлу);  

Перед тем, как начать считывание данных, укажем лист книги, с которого будем считывать данные:

 Лист = Книга.WorkSheets(НомерЛиста);  

Нумерация листов книги начинается с 1. Общее количество листов можно получить, используя следующую команду:

 КоличествоЛистов = Книга.Sheets.Count;  

Лист можно выбрать по имени листа в книге:

 Лист = Книга.WorkSheets(ИмяЛиста);   

Имя листа в книге можно получить по номеру:

 ИмяЛиста = Книга.Sheets(НомерЛиста).Name;  

Итак, мы открыли книгу и выбрали лист, теперь посмотрим, сколько строк и колонок на выбранном листе:

ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;

ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

Получим значения ячейки листа в строке НомерСтроки и в колонке НомерКолонки:

 Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;  

Ниже приведен отрывок кода, запустив который мы прочитаем все данные с первой страницы:

Эксель = СоздатьОбъект(“Excel.Application”);
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
Лист = Книга.WorkSheets(1);

ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Для Строка = 1 по ВсегоСтрок цикл
     для Колонка = 1 по ВсегоКолонок цикл
          Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value);
     КонецЦикла;
КонецЦикла;
где ПутьКФайлу – полный путь к файлу книги Excel (включая имя).

После выполнения действий необходимо закрыть книгу:

 Эксель.Application.Quit();  

Выгрузка данных в Excel

Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:

Попытка

Эксель = СоздатьОбъект("Excel.Application");

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Книга = Эксель.WorkBooks.Add();

При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:

 Лист = Книга.WorkSheets(НомерЛиста);  

Или добавить в книгу новый лист:

 Лист = Книга.Sheets.Add();   

Добавим в ячейку на листе значение:

 Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;   

Запишем книгу:

Попытка
     Книга.SaveAs(ПутьКФайлу);
Исключение
     Сообщить(ОписаниеОшибки()+” Файл не сохранен!”);
КонецПопытки;

где ПутьКФайлу – полный путь к файлу книги Excel (включая имя).

После выполнения действий необходимо закрыть книгу:

 Эксель.Application.Quit();  

Здесь можно скачать обработку, позволяющую из выбранного файла Excel загрузить данные со всех страниц:

Часто используемые методы Excel

Эксель.Visible = Видимость; 0 – Excel не виден, 1 – виден.
Книга = Эксель.WorkBooks.Add(); Создание новой книги (файла) Excel.
Книга.SaveAs(ИмяФайла); Сохранение книги Excel.
Лист = Книга.WorkSheets.Add(); Добавление нового листа в книгу.
Книга = Эксель.WorkBooks.Open(ИмяФайла); Открытие существующей книги (файла) Excel.
Лист = Книга.WorkSheets(НомерЛиста); Установка листа в качестве рабочего с номером НомерЛиста.
Лист.Name = ИмяЛиста; Задание рабочему листу имени ИмяЛиста
Лист.PageSetup.Zoom = Масштаб; Задание параметра страницы “Масштаб” (от 10 до 400).
Лист.PageSetup.Orientation = Ориентация; Ориентация: 1 – книжная, 2 – альбомная.
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); Задание левой границы (в сантиметрах).
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); Задание верхней границы (в сантиметрах).
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); Задание правой границы (в сантиметрах).
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); Задание нижней границы (в сантиметрах).
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; Задание ширины колонке.
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; Ввод данных в ячейку.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; Установка шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; Установка размера шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; 1 – жирный шрифт, 0 – нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; 1 – наклонный шрифт, 0 – нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; 2 – подчеркнутый, 1 – нет.
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; Установка формата данных ячейки.
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; Установка рамок ячейки. 1 – тонкая сплошная.
Лист.Protect(); Установка защиты на лист
Лист.UnProtect(); Снятие защиты с листа
Лист.Cells(Строка, Столбец).Locked=0; Ячейка будет доступной (и после установки защиты на лист)

Хитрости Excel

Как выборочно разрешить / запретить редактирование ячеек листа

//Создаем объект EXCEL
Эксель = СоздатьОбъект(“Excel.Application”);
Книга = Эксель.WorkBooks.Open(ФайлВыгрузки);
Лист =Книга.Worksheets(“Список сотрудников”); // Выбор листа        
Книга.ActiveSheet.UnProtect();   
//делаем шаблон незащищенным 
// Заполняем лист  …………………………….. 
// Снимаем защиту с области ввода сумм
Для Перем = 1 По 10 Цикл    
     // Прописываем, какие ячейки будут доступными      
     Книга.ActiveSheet.Cells(Перем, 2).Locked=0;
КонецЦикла;
Книга.ActiveSheet.Protect();    // ставим защиту на лист

Взято с http://programna1c.narod.ru/docs/Excel/Excel1C8.html

   Ricco

19.09.06 — 13:50

Поддерживаю удаленно 1С Торговля 9.0. Выслал им свой внешний отчет с выводом в Excel. Дает ошибку:

Excel = СоздатьОбъект(«Excel.Application»)

Неудачная попытка создания объекта (Excel.Application)

Спрашивал, есть ли у них Excel, говорят есть и работает. Нет мыслей что может быть. Кто знает?

   smaharbA

1 — 19.09.06 — 13:52

1. авирь

2. ОО

3. нет прав на ОЛЕ

   AcaGost

2 — 19.09.06 — 13:52

(0) Пусть закроют Excel

   Ricco

3 — 19.09.06 — 13:57

(1) Нельзя узнать как регулируются права на OLE и что есть «ОО»?

   Азат

4 — 19.09.06 — 13:58

(3) OO — Open Office

   sapphire

5 — 19.09.06 — 14:13

(4) Ты его по OLE начился создавать? Тогда покажи пример.

   Ricco

6 — 19.09.06 — 15:07

(5)      Таб.Записать(Файл,»XLS»);

   Excel = СоздатьОбъект(«Excel.Application»);

   Excel.SheetsInNewWorkbook = 1;

   ФайлExcel = Excel.Workbooks.Open(Файл);

   Excel.DisplayAlerts = -1;

   ФайлExcel.Save();

   Excel.Visible=-1;

   ФайлExcel.Windows(1).Activate();

Но тут проблемная строчка «Excel = СоздатьОбъект(«Excel.Application»);» практически первая, до остальных даже не доходит.

   sapphire

7 — 19.09.06 — 15:11

А Excel установлен? :)
P.S:а зачем такой огород?

   sapphire

8 — 19.09.06 — 15:14

Попробуй
ЗапуститьПриложение(Файл);

   Ricco

9 — 19.09.06 — 15:14

(7) Excel установлен. А как проще?

   sapphire

10 — 19.09.06 — 15:15

Можешь у себя проверить через формульный калькулятор.
ЗапуститьПриложение(«C:test.xls»)

   Алгоритм

11 — 19.09.06 — 15:15

Excel = CreateObject(«Excel.Application»);

   Heckfy

12 — 19.09.06 — 15:16

У пользователя 1С в правах стоит Использование в качестве ОЛЕ сервера? И смотри

(11)

   sapphire

13 — 19.09.06 — 15:19

(11)(12) Судя по (6) это не нужно, достаточно (8)

   smaharbA

14 — 19.09.06 — 15:21

(5) по ОЛЕ ОО давно научен общаться и даже с 1С

   sapphire

15 — 19.09.06 — 15:25

(14) Это верно. Но, для этого нужно знать объектную модель ОО и как именно его вызывать.

   gr13

16 — 19.09.06 — 15:25

у меня было такое… просто офис не был установлен)))

   sapphire

17 — 19.09.06 — 15:25

(14) даже StarOffice 5.0 вызывался, но были проблемы с кодировками.

   Ricco

18 — 19.09.06 — 15:27

(8) Раз запустился, а больше не хочет. То есть файл создается но не открывается, не ругается

   sapphire

19 — 19.09.06 — 15:29

(18) Убей Excel-евские процессы

   sapphire

20 — 19.09.06 — 15:31

ЗапуститьПриложение отрабатывает аналогично проводнику — передает винде управление

   Ricco

21 — 19.09.06 — 15:31

(19) Как?

   sapphire

22 — 19.09.06 — 15:32

Через диспетчер задач — процессы

   gr13

23 — 19.09.06 — 15:39

(21) … гы гы гы… killtask

   gr13

24 — 19.09.06 — 15:40

tasklist
taskkill

   ru5t

25 — 19.09.06 — 18:10

вы должны закрыть ВСЕ экселевские процессы использующие файл, который вы хотите обработать. У меня так же были проблемы на этом этапе

   smaharbA

26 — 19.09.06 — 18:38

(19)-(25) да ну ? и это поможет для Excel = СоздатьОбъект(«Excel.Application»); ?

  

ru5t

27 — 19.09.06 — 20:04

да , при наличии соответствующих прав .

1С 8.х и Excel

Чтение данных из Excel

Доступ из 1С к Excel производится посредством OLE. Создание COM-объекта:

Попытка
Эксель = СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;

Теперь используя переменную Эксель можно управлять приложением Excel.

  • Внимание! Microsoft Excel должен быть установлен на компьютере!

Следующая команда откроет книгу:

Книга = Эксель.WorkBooks.Open(ПутьКФайлу);

Перед тем, как начать считывание данных, укажем лист книги, с которого будем считывать данные:

Лист = Книга.WorkSheets(НомерЛиста);

Нумерация листов книги начинается с 1. Общее количество листов можно получить, используя следующую команду:

КоличествоЛистов = Книга.Sheets.Count;

Лист можно выбрать по имени листа в книге:

Лист = Книга.WorkSheets(ИмяЛиста);

Имя листа в книге можно получить по номеру:

ИмяЛиста = Книга.Sheets(НомерЛиста).Name;

Итак, мы открыли книгу и выбрали лист, теперь посмотрим, сколько строк и колонок на выбранном листе:

ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

Получим значения ячейки листа в строке НомерСтроки и в колонке НомерКолонки:

Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;

Ниже приведен отрывок кода, запустив который мы прочитаем все данные с первой страницы:

Эксель = СоздатьОбъект("Excel.Application");
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
Лист = Книга.WorkSheets(1);

ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

для Строка = 1 по ВсегоСтрок цикл

для Колонка = 1 по ВсегоКолонок цикл
Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value);
КонецЦикла;

КонецЦикла;

Где ПутьКФайлу — полный путь к файлу книги Excel (включая имя).

После выполнения действий необходимо закрыть книгу:

Эксель.Application.Quit();

Выгрузка данных в Excel

Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:

Попытка
Эксель = СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Книга = Эксель.WorkBooks.Add();

При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:

Лист = Книга.WorkSheets(НомерЛиста);

Или добавить в книгу новый лист:

Лист = Книга.Sheets.Add();

Добавим в ячейку на листе значение:

Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;

Запишем книгу:

Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
КонецПопытки;

Где ПутьКФайлу — полный путь к файлу книги Excel (включая имя).

После выполнения действий необходимо закрыть книгу:

Эксель.Application.Quit();

Часто используемые методы Excel

Эксель.Visible = Видимость; 0 — Excel не виден, 1 — виден.
Книга = Эксель.WorkBooks.Add(); Создание новой книги (файла) Excel.
Книга.SaveAs(ИмяФайла); Сохранение книги Excel.
Лист = Книга.WorkSheets.Add(); Добавление нового листа в книгу.
Книга = Эксель.WorkBooks.Open(ИмяФайла); Открытие существующей книги (файла) Excel.
Лист = Книга.WorkSheets(НомерЛиста); Установка листа в качестве рабочего с номером НомерЛиста.
Лист.Name = ИмяЛиста; Задание рабочему листу имени ИмяЛиста
Лист.PageSetup.Zoom = Масштаб; Задание параметра страницы «Масштаб» (от 10 до 400).
Лист.PageSetup.Orientation = Ориентация; Ориентация: 1 — книжная, 2 — альбомная.
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); Задание левой границы (в сантиметрах).
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); Задание верхней границы (в сантиметрах).
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); Задание правой границы (в сантиметрах).
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); Задание нижней границы (в сантиметрах).
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; Задание ширины колонке.
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; Ввод данных в ячейку.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; Установка шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; Установка размера шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; 1 — жирный шрифт, 0 — нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; 1 — наклонный шрифт, 0 — нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; 2 — подчеркнутый, 1 — нет.
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; Установка формата данных ячейки.
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; Установка рамок ячейки. 1 — тонкая сплошная.
Лист.Protect(); Установка защиты на лист
Лист.UnProtect(); Снятие защиты с листа
Лист.Cells(Строка, Столбец).Locked=0; Ячейка будет доступной (и после установки защиты на лист)

Хитрости Excel

Как выборочно разрешить / запретить редактирование ячеек листа

//Создаем объект EXCEL
Эксель = СоздатьОбъект("Excel.Application"); 
Книга = Эксель.WorkBooks.Open(ФайлВыгрузки); 
Лист =Книга.Worksheets("Список сотрудников"); // Выбор листа

     Книга.ActiveSheet.UnProtect();    //делаем шаблон незащищенным

// Заполняем лист

...................................

// Снимаем защиту с области ввода сумм

Для Перем = 1 По 10 Цикл
// Прописываем, какие ячейки будут доступными 
Книга.ActiveSheet.Cells(Перем, 2).Locked=0;
КонецЦикла;

Книга.ActiveSheet.Protect();    // ставим защиту на лист

Как осуществить поиск / замену значений ячеек на листе

//Выбираем область поиска - весь лист
ОбластьПоиска = Лист.Cells;

// Укажем начало листа
НачалоЛиста = Диапазон.Cells(1, 1);

// Ищем ячейку с текстом, указанным в переменной ТекстДляПоиска,
//укажем откуда искать - с начала листа
ОбластьПараметр = ОбластьПоиска.Find(ТекстДляПоиска, НачалоЛиста);

// Если нашли, заполняем значением из переменной Значение
Если ОбластьПараметр <> неопределено Тогда
ОбластьПараметр.Value = Значение;
КонецЕсли;

Замечание. Текст для замены лучше выделять, например, в угловые скобки, аналогично параметрам макета в 1С. Это улучшит наглядность, визуально отделит от рабочего текста.
Текст для поиска в этом случае будет выглядеть так:

ТекстДляПоиска = «<ИмяДляЗамены>»

Как скопировать / удалить строку

//Выбираем область поиска - весь лист
ОбластьПоиска = Лист.Cells;

// Найдем нужную нам ячейку
// Если не указываем откуда искать - то с текущей ячейки, это первая ячейка на листе
НайденнаяОбласть = ОбластьПоиска.Find("Текст для поиска");

// Выделяем всю строку
НайденнаяОбласть.EntireRow.Select();

// Копируем выделенное
НайденнаяОбласть.EntireRow.Copy();

// Вставляем (новая строка будет вставлена тут же)
НайденнаяОбласть.EntireRow.Insert();

// Теперь как удалить строку. Найдем область
НайденнаяОбласть = ОбластьПоиска.Find("Текст для поиска", НачалоЛиста);
НайденнаяОбласть.EntireRow.Delete();

Замечание. Приведенные выше примеры позволят, например, организвать работу с шаблонами на основании листов Excel.

————————
Взято отсюда: http://programna1c.narod.ru/docs/Excel/Excel1C8.html


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

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

  • Главная
  • О сайте
  • Главная
  • Содержание

Рукопашный бой Карташ

Категории

—>

рубрики: Excel | Дата: 19 июня, 2017
Скачать обработку с примерами из статьи: professia1c_ExcelApplication.epf
Платформа: 8.3; Тип формы: управляемая.

Одним из самых распространенных методов при работе с файлами Excel из 1С является использование COM соединения, т.е создание объекта Excel.Application и дальнейшая работа с ним средствами встроенного в ексель языка VBA. При помощи этого метода можно как записывать данные в файл Excel, так и читать их из файла.
Рассмотрим обе эти возможности на небольших примерах.

Запись данных в Excel

В прошлой статье про формирование файла Excel из табличного документа был показан пример записи в файл вот такой простенькой таблицы

Товар Количество
Яблоки 5
Груши 10

Проделаем то же самое (запишем таблицу значений в файл ексель), но уже с использованием объекта Excel.Application. Сделать это можно с помощью следующей процедуры




&НаСервере
Процедура ЗаписатьТаблицуЗначенийВФайлЕксель(Таблица)

	ДокументЕксель	= Новый COMОбъект("Excel.Application");
	КнигаЕксель		= ДокументЕксель.WorkBooks.Add(); //Создаем книгу ексель
	ЛистЕксель		= КнигаЕксель.WorkSheets(1); //Позиционируемся на 1-м листе

	КоличествоКолонок = Таблица.Колонки.Количество();

	//Формируем строку с заголовками
	Для Счетчик = 1 По КоличествоКолонок Цикл

		ТекущаяКолонка = Таблица.Колонки[Счетчик - 1];
		ЛистЕксель.Cells(1, Счетчик).Value = ТекущаяКолонка.Имя;

	КонецЦикла;

	//Добавляем строки из таблицы
	НомерСтроки = 2;
	Для каждого СтрокаТаблицы Из Таблица Цикл

		Для НомерКолонки = 1 По КоличествоКолонок Цикл

			ЛистЕксель.Cells(НомерСтроки, НомерКолонки).Value = Строка(СтрокаТаблицы[НомерКолонки - 1]);

		КонецЦикла;
		НомерСтроки = НомерСтроки + 1;

	КонецЦикла;

	КнигаЕксель.SaveAs("D:musorTest.xlsx"); // Сохраняем файл ексель
	ДокументЕксель.Application.Quit(); // Закрываем COM соединение

КонецПроцедуры

Здесь необходимо сделать несколько пояснений. Поскольку процедура серверная (клиентскую в данном случае сделать не получиться, т.к. тонкий клиент не работает с таблицей значений) необходимо понимать, что Excel должен быть установлен на сервере, т.е. там же где установлен сервер 1С:Предприятия. В других ситуациях запись файла ексель возможна и на клиенте. И тут уже Excel должен быть установлен на каждой клиентской машине, где будет выполняться эта процедура.
Для простоты кода не стал использовать конструкции Попытка — Исключение. Хотя в реальном коде они конечно же должны использоваться при создании COM объекта и т.д. В случае выполнения кода на клиенте мы можем после сохранения файла, дать возможность пользователю просмотреть его и при необходимости отредактировать. Для этого достаточно установить видимость объекта Excel в 1. Закрывать программно объект в этом случае не требуется. Его потом закроет пользователь вручную.




КнигаЕксель.SaveAs("D:musorTest.xlsx"); // Сохраняем файл ексель
ДокументЕксель.Visible = 1;
//ДокументЕксель.Application.Quit(); // Закрываем COM соединение

Чтение данных из Excel

Теперь посмотрим как реализуется обратная задача по чтению данных из файла Excel. Для этого воспользуемся файлом созданным в первом примере и прочитаем его в табличный документ с помощью вот такой процедуры:




&НаКлиенте
Процедура ПрочитатьФайлЕксель(Команда)

	ДокументЕксель	= Новый COMОбъект("Excel.Application");
	КнигаЕксель		= ДокументЕксель.WorkBooks.Open("D:musorTest.xlsx"); //Открываем файл ексель
	ЛистЕксель		= КнигаЕксель.WorkSheets(1); //Позиционируемся на 1-м листе

	ТабДок = Новый ТабличныйДокумент;

	Для НомерСтроки = 1 По ЛистЕксель.UsedRange.Rows.Count Цикл

		Для НомерКолонки = 1 По ЛистЕксель.UsedRange.Columns.Count Цикл

			ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст = ЛистЕксель.Cells(НомерСтроки, НомерКолонки).Value;

		КонецЦикла;

	КонецЦикла;

	ТабДок.Показать();

	ДокументЕксель.Application.Quit(); // Закрываем COM соединение

КонецПроцедуры

Как видим на клиенте можно также успешно создавать объект Excel.Application. А для подсчета количества строк и колонок на листе применяем свойство UsedRange — используемый диапазон.

Заключение

Таким образом при необходимости записать данные в файл Excel или наоборот прочитать их из файла и при минимальном знании VBA мы можем воспользоваться COM объектом Excel.Application. Конечно сейчас были рассмотрены самые примитивные свойства и методы, но при необходимости можно воспользоваться справкой по VBA в Excel и программно создать файл с достаточно сложным оформлением. Хотя в этом случае наверное проще будет заранее создать файл с шаблоном и заполнять уже его. Данный метод требует установленного приложения Excel и является не очень производительным. По крайней мере чтение и запись в Excel c помощью ADO работает гораздо быстрее.

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Excel создать ячейку с поиском
  • Excel создать ячейку для поиска
  • Excel создать ячейки в ячейке
  • Excel создать формулу по цвету ячейки
  • Excel создать формулу если ячейка равна то

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии