Закрыть эксель в 1с

Обновлено: 02.07.2024

Как осуществить чтение/запись данных из/в Excel на языке 1с (используя COM-объект)

Основные методы, принципы и хитрости, используемые при работе с EXCEL через COM-объект

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

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

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

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

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

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

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

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

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

Точно так же можно задать имя листа:

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

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

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

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

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

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

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

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

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

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

Как программно сохранить файл Excel в формате 2003 года

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

Хитрости Excel

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

Как запретить появление на экране всяких вопросов от Excel

Excel, чтоб вопрос не задавал:

Как добавить лист Excel в конец списка листов книги или после конкретного листа (а не в начало книги)

Метод работает для платформ 1С v8.

Как программно скрыть колонку файла Excel

Как программно назначить ячейке файла Excel перенос по словам

Как обработать файл xls, если Excel не установлен на компьютере

Для этого можно использовать метод

Код для 7.7, решающий такую задачу, будет выглядеть примерно так:

Как указать цвет шрифта в ячейке, цвет рамки, цвет фона

Организация автоматической обработки файлов xls из выбранной папки

Создание кнопки в Excel в 7.7

текст макроса пишется в переменную st

Как подключиться к запущенному Excel-евскому файлу в реальном времени, изменить его и даже не сохранять, а просто переключить окно на 1С и сразу же выгружать данные в табличную часть, лишь переключив окна

Описание команды ПолучитьCOMОбъект

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

Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Пример:

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

Клиент-Серверный вариант в управляемых формах.

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

2-ой способ - это передать файл Excel на сервер через хранилище данных и далее работать с ним уже на сервере.

Очень часто приходится работать с очень большими файлами Excel, и его обработка путем перебора строк занимает огромное количество времени.

В таких случаех удобно в одно действие загрузить всю таблицу в массив и в потом работать уже непосредственно с массивом.

На выходе получаем двумерный массив, который содержит все данные указанного листа Excel

Полезные функции при работе с Excel:

Устанавливает видимость Excel при работе
Добавление новой книги в файл Excel
Сохранение книги Excel
Добавление нового листа к книге
Переименование листа
Изменение маштаба листа
Изменение ориентации листа
Отступы листа
Обращение к ячейки
чтение/запись
Обращение к области ячеек
Очень часто при чтении или записи значений в Excel ставятся лишние пробелы в числе, например, вместо 1502 он читает как 1 502 и в дальнейшем это значение не приводится к числу. Эту проблему можно решить заменой.
Объединение ячеек
Работа с именованными ячейками в Excel
Удаление ячейки
Удаление области ячеек
Обращение к строке
Изменение ширины колонки
Обращение к колонке
Удаление Строки
Фон ячейки / области / Строки /
Функция переводит цвет из формата RGB в формат Excel
Управление шрифтом в ячейки/строке/области
Р азрешает переносить по словам в ячейке
Управление рамкой ячейки
Устанавливаем формат ячейки
Формула в ячейки
Формула в ячейки
Формула в ячейки
Формула в ячейки
Функция для получения ширины колонки Excel
Спасибо пользователю goodwill
Разрешить перенос слов в ячейке
Спасибо пользователю roofless
Группировки данных на листе
Спасибо пользователю dr-wit, ignor

При работе с Excel мы оперируем столбцами как числом (Например, 1 столбец), а у Excel адресация столбцов производится с помощью символов. И когда нам нужно отредактировать формулу, то нам нужно номер столбца преобразовать в символ. В таких случаях вам пригодится эта функция.

2. Работа с Excel через ТабличныйДокумент 1С

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

Итак, приступим: загрузка из Excel:

1. Загружаем файл Excel в табличный документ

2. Производим манипуляции уже с ТабличнымДокументом

Давайте теперь разберем сохранение в Excel с помощью данного метода:

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

2. Работа с Excel ADODB

Выражаю особую благодарность коллеги Fragster за хороший комментарий

Данный метод позволяет работать с Excel через ODBC и имеет ряд преимуществ:

  1. Не требует установки самой Excel, необходима лишь установить ODBC. Но как правило он уже установлен. Это особенность позволяет работать на стороне сервера без дополнительных установок Excel.
  2. Позволяет работать с таблицой Excel как с БД и строить к ней запросы на T-SQL. Таким образом мы можем делать отборы еще на этапе чтения данных и другие преимущества что дает Т-SQL. Что на мой взгляд огромный плюс.

Подключение к ADO

Отключение от ADO


Выполнение запроса

Пример запроса:

Запись в Excel тоже производится в виде запроса:

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


ADODB предоставляет ряд объектов, с которыми мы работаем

ADODB.Recordset

В файле продемонстрированны оба варианта работы с запросами.

На этом пока все. По возможности буду дополнять статью :)

В архиве находится обработка, которая демонстрирует все описанные и другие возможности при работе с Excel.

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

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

Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:
При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:
Или добавить в книгу новый лист:
Добавим в ячейку на листе значение:
Запишем книгу:
Где ПутьКФайлу - полный путь к файлу книги 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

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

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

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


&НаКлиенте
Процедура ФайлНачалоВыбора ( Элемент , ДанныеВыбора , СтандартнаяОбработка ) //необходимо в событии "НачалоВыбора" поля ввода вызвать ДиалогВыбораФайла

Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие );
Диалог . Заголовок = "Выберите файл Excel" ;
Диалог . ПредварительныйПросмотр = Ложь;
Диалог . Фильтр = "(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx" ;

Если ЗначениеЗаполнено ( Объект . Файл ) Тогда
Диалог . ПолноеИмяФайла = Объект . Файл ;
КонецЕсли;

Если Диалог . Выбрать () Тогда
Объект . Файл = Диалог . ПолноеИмяФайла ;
КонецЕсли;

&НаСервере
Процедура ЗагрузитьИзXLS () // в документ Поступление материалов

// Попытка открытия файла Excel
Попытка
Excel_App = Новый COMОбъект ( "Excel.Application" );
Excel_App . WorkBooks . Open ( Объект . Файл );
Исключение
Сообщить ( "Произошла ошибка при открытии файла " + СокрЛП ( ОписаниеОшибки ())+ "! Операция прервана!" );
Возврат;
КонецПопытки;

// Попытка выбрать первый лист (можно указать другой)
Попытка
Excel_App . Sheets ( 1 ). Select ();
Исключение
// Если первый лист не найден - закрываем файл
Excel_App . ActiveWorkbook . Close ();
Excel_App = 0 ;
Сообщить ( "Первый лист не найден!" );
ОтменитьТранзакцию ();
Возврат;
КонецПопытки;

// Вычисление количества строк и колонок в зависимости от версии Excel
version_Ex = Лев ( Excel_App . Version , Найти ( Excel_App . Version , "." )- 1 );
Если version_Ex = "8" тогда
Колич_Строк = Excel_App . Cells . CurrentRegion . Rows . Count ;
Колич_Колонок = Макс ( Excel_App . Cells . CurrentRegion . Columns . Count , 13 );
Иначе
Колич_Строк = Excel_App . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Колич_Колонок = Excel_App . Cells ( 1 , 1 ). SpecialCells ( 11 ). Column ;
Конецесли;

// Имена колонок в файле должны совпадать с именами реквизитов табличной части, в которую загружаются данные
// Переменная ТЗ_Колонки содержит список номеров колонок, которые будут перегружаться
ТЗ_Колонки = Новый ТаблицаЗначений ;
ТЗ_Колонки . Колонки . Добавить ( "НомерКолонки" );
ТЗ_Колонки . Колонки . Добавить ( "НазваниеКолонки" );

Для Каждая_Колонка = 1 по Колич_Колонок Цикл

ИмяКолонки = Excel_App . Cells ( 1 , Каждая_Колонка ). Text ;
ИмяБезПробелов = СтрЗаменить ( ИмяКолонки , " " , "" ); // Удаление лишних пробелов из имен колонок

// Проверка наличия реквизитов табличной части "Материалы" в документе "ПоступлениеМатериалов"
Если НЕ ПроверкаРеквизитаТЧ ( ИмяБезПробелов , Метаданные . Документы . ПоступлениеМатериалов , "Материалы" ) Тогда
Сообщить ( "Не найден реквизит с именем " + ИмяБезПробелов + "! Колонка не будет загружена!" );
Иначе
Новая_Строка = ТЗ_Колонки . Добавить ();
Новая_Строка . НомерКолонки = Каждая_Колонка ;
Новая_Строка . НазваниеКолонки = ИмяБезПробелов ;
КонецЕсли;

// Если есть колонки для загрузки и есть колонка "Материалы" (обязательная к заполнению)
Если ТЗ_Колонки . Количество () <> 0 и
ТЗ_Колонки . НайтиСтроки (Новый Структура ( "НазваниеКолонки" , "Материалы" )). Количество () <> 0 Тогда

// Создание документа и заполнение реквизитов шапки
Тек_Документ = Документы . ПоступлениеМатериалов . СоздатьДокумент ();
Тек_Документ . Комментарий = "Загружено из файла " + Объект . Файл ;
Тек_Документ . Дата = ТекущаяДата ();
Тек_Документ . Ответственный = ПараметрыСеанса . ТекущийПользователь ;

Для Тек_Строка = 1 по Колич_Строк Цикл // Заполнение табличной части "Материалы"

Строка_Док = Тек_Документ . Материалы . Добавить ();
Строка_Док . Валюта = Тек_Документ . ТипЦен . ВалютаЦены ;

Для каждого Тек_ТЗ из ТЗ_Колонки Цикл

Тек_Значение = Excel_App . Cells ( Тек_Строка , Тек_ТЗ . НомерКолонки ). Text ;

// Получение имени колонки
ИмяКолонкиДокумента = Excel_App . Cells ( 1 , Тек_ТЗ . НомерКолонки ). Text ;

// Заполнение строки данными
Если ИмяКолонкиДокумента = "Материалы" Тогда
Строка_Док . Номенклатура = Справочники . Материалы . НайтиПоНаименованию ( Тек_Значение , Истина);
ИначеЕсли ИмяКолонкиДокумента = "Цена" Тогда
Строка_Док . Цена = Тек_Значение ;
ИначеЕсли ИмяКолонкиДокумента = "Ставка_НДС" Тогда
Строка_Док . Ставка_НДС = Тек_Значение ;
КонецЕсли;

КонецЦикла;
Тек_Документ . Записать ( РежимЗаписиДокумента . Проведение ); // Запись и проведение документа
Сообщить ( "Записан документ " + СокрЛП ( Тек_Документ ));
Иначе
Сообщить ( "В файле " + СокрЛП ( Объект . Файл )+ " не достаточно данных для заполнения документа!" );
КонецЕсли;

Excel_App . DisplayAlerts = 0 ;
Excel_App . Quit ();
Excel_App . DisplayAlerts = 1 ;

&НаСервере
Функция ПроверкаРеквизитаТЧ ( ИмяРекв , МетаданныеДок , ИмяТЧ )

// Проверка наличия ТЧ
ТаблЧасть = МетаданныеДок . ТабличныеЧасти . Найти ( ИмяТЧ );
Если ТаблЧасть = Неопределено Тогда // Нет такой таб. части в документе
Возврат Ложь; //реквизит не найден
Иначе
Возврат НЕ ( ТаблЧасть . Реквизиты . Найти ( ИмяРекв ) = Неопределено); //реквизит найден
КонецЕсли;

&НаСервере
Процедура ВыгрузитьВXLS ( Выб_Таблица )

Если Выб_Таблица . Количество () = 0 Тогда
Сообщить ( "Пустая таблица! Операция прервана!" );
Возврат;
КонецЕсли;

Попытка
Excel_App = Новый COMОбъект ( "Excel.Application" ); // Подключение к Excel
Исключение
Сообщить ( "Произошла ошибка при открытии файла " + СокрЛП ( ОписаниеОшибки ())+ "! Операция прервана!" );
Возврат;
КонецПопытки;

Попытка
Book_Excel = Excel_App . WorkBooks . Add ();

Sheet_Excel = Book_Excel . WorkSheets ( 1 );
Sheet_Excel . Name = "Test Sheet" ; // Присваиваем имя первому листу

Excel_App . ActiveWindow . View = 2 ; // Режим страничного просмотра
Excel_App . ActiveWindow . Zoom = 100 ; // Масштаб
Sheet_Excel . PageSetup . Orientation = 2 ; // Альбомная ориентация
Sheet_Excel . Columns ( 1 ). ColumnWidth = 20 ; // Ширина первой колонки
Sheet_Excel . Columns ( 2 ). ColumnWidth = 40 ; // Ширина второй колонки
Sheet_Excel . Columns ( 10 ). ColumnWidth = 15 ;
Sheet_Excel . Columns ( 11 ). ColumnWidth = 15 ;

Sheet_Excel . Cells ( 1 , 1 ). Value = "№ ПП" ; //Создаем шапку 1
Sheet_Excel . Cells ( 1 , 2 ). Value = "Текст" ;
Sheet_Excel . Cells ( 1 , 3 ). Value = "Числа" ;
Sheet_Excel . Cells ( 1 , 10 ). Value = "Дата" ;
Sheet_Excel . Cells ( 1 , 11 ). Value = "Формула" ;

Sheet_Excel . Cells ( 2 , 3 ). Value = "Число 1" ; //Создаем шапку 2
Sheet_Excel . Cells ( 2 , 4 ). Value = "Число 2" ;
Sheet_Excel . Cells ( 2 , 5 ). Value = "Число 3" ;
Sheet_Excel . Cells ( 2 , 6 ). Value = "Число 4" ;
Sheet_Excel . Cells ( 2 , 7 ). Value = "Число 5" ;
Sheet_Excel . Cells ( 2 , 8 ). Value = "Число 6" ;
Sheet_Excel . Cells ( 2 , 9 ). Value = "Число 7" ;

Sheet_Excel . Range ( "A1:A2" ). MergeCells = Истина; Sheet_Excel . Range ( "A1:A2" ). WrapText = Истина;
Sheet_Excel . Range ( "B1:B2" ). MergeCells = Истина; Sheet_Excel . Range ( "B1:B2" ). WrapText = Истина;
Sheet_Excel . Range ( "J1:J2" ). MergeCells = Истина; Sheet_Excel . Range ( "J1:J2" ). WrapText = Истина;
Sheet_Excel . Range ( "K1:K2" ). MergeCells = Истина; Sheet_Excel . Range ( "K1:K2" ). WrapText = Истина;
Sheet_Excel . Range ( "C1:I1" ). MergeCells = Истина; Sheet_Excel . Range ( "C1:I1" ). WrapText = Истина;

Sheet_Excel . Range ( "A1:K2" ). Borders . Linestyle = 1 ; //Линия границы
Sheet_Excel . Range ( "A1:K2" ). HorizontalAlignment = 3 ; //Выравнивание по горизонтали
Sheet_Excel . Range ( "A1:K2" ). VerticalAlignment = 2 ; //Выравнивание по вертикали
Sheet_Excel . Range ( "A1:K2" ). Font . Bold = 1 ; //Установим жирный шрифт в шапке

// Выгружаем данные в таблицу
Количество_Строк = 3 ; //Заполнение ТЧ начинаем с третьей строки
Для Каждого ТекСтрока Из Выб_Таблица Цикл
Sheet_Excel . Cells ( Количество_Строк , 1 ). Value = ТекСтрока . НомерПоПорядку ;
Sheet_Excel . Cells ( Количество_Строк , 2 ). Value = ТекСтрока . Табл_Текст ;
Sheet_Excel . Cells ( Количество_Строк , 3 ). Value = ТекСтрока . Табл_Число1 ;
Sheet_Excel . Cells ( Количество_Строк , 4 ). Value = ТекСтрока . Табл_Число2 ;
Sheet_Excel . Cells ( Количество_Строк , 5 ). Value = ТекСтрока . Табл_Число3 ;
Sheet_Excel . Cells ( Количество_Строк , 6 ). Value = ТекСтрока . Табл_Число4 ;
Sheet_Excel . Cells ( Количество_Строк , 7 ). Value = ТекСтрока . Табл_Число5 ;
Sheet_Excel . Cells ( Количество_Строк , 8 ). Value = ТекСтрока . Табл_Число6 ;
Sheet_Excel . Cells ( Количество_Строк , 9 ). Value = ТекСтрока . Табл_Число7 ;
Sheet_Excel . Cells ( Количество_Строк , 10 ). Value = ТекСтрока . Табл_Дата ;
Sheet_Excel . Cells ( Количество_Строк , 11 ). Formula = "=F" + Строка ( Количество_Строк )
+ "+G" + Строка ( Количество_Строк );

Количество_Строк = Количество_Строк + 1 ;
КонецЦикла;

Количество_Строк = Количество_Строк - 1 ; //Последняя строка для форматирования

Sheet_Excel . Range ( "A3:K" + Строка ( Количество_Строк )). Borders . Linestyle = 1 ; //Линия границы
Sheet_Excel . Range ( "A3:K" + Строка ( Количество_Строк )). VerticalAlignment = 2 ; //Выравнивание по вертикали

Для НомерСтроки = 3 По Количество_Строк Цикл // Установка числового формата
Для Столбец = 4 По 9 Цикл
Sheet_Excel . Cells ( НомерСтроки , Столбец ). NumberFormat = "0.00" ;
КонецЦикла;
Sheet_Excel . Cells ( НомерСтроки , 11 ). NumberFormat = "0.00" ;
КонецЦикла;

Исключение
Excel_App . Quit ();
Сообщить ( ОписаниеОшибки ());
Возврат;
КонецПопытки;

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

Попытка
Excel_App . Quit ();
Исключение
Сообщить ( ОписаниеОшибки ());
Возврат;
КонецПопытки;

Читайте также: