Многостраничный Excel из 1С

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

С помощью объекта ПакетОтображаемыхДокументов

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

// Сохраняет табличные документы в файл Эксель
//
// Параметры:
// ИмяФайла — Строка — указывающая имя сохраняемого файла.
//     Можно включить полный путь;
// МассивДанных — Массив — массив соответствий:
//   * ДанныеЛиста — соответствие:
//     ** АдресВХранилище — адрес табличного документа во временном хранилище
//     ** Имя — имя листа.
// &НаКлиенте
Процедура СформироватьФайлПакетом(ИмяФайла, МассивДанных)
	Пакет = Новый ПакетОтображаемыхДокументов;
  	Для Каждого ДанныеЛиста Из МассивДанных Цикл
		АдресВХранилище = ДанныеЛиста[«АдресВХранилище»];
		ЭлементПакета = Пакет.Состав.Добавить();
		ЭлементПакета.Наименование = ДанныеЛиста[«Имя»];
		ЭлементПакета.Данные = АдресВХранилище;
  	КонецЦикла;
 	Попытка
		Пакет.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
		ПоказатьПредупреждение(, «Файл выгружен в « + ИмяФайла);
  	Исключение
		ПоказатьПредупреждение(,«Ошибка выгрузки в « + ИмяФайла);
		Сообщить(ОписаниеОшибки());
  	КонецПопытки;
КонецПроцедуры // СформироватьФайлПакетом()

ИмяФайла – имя файла в который будет сохранена книга. Можно перед вызовом функции предлагать пользователю указать каталог, куда будет сохраняться файл, и в параметр передать полный путь до файла, например “D:\Файлы\МойФайлЭксель.xlsx”.

МассивДанных — массив соответствий с данными для формирования книги. Массив собираю на сервере. Соответствие представляет из себя коллекцию значений в связки с ключем. Ключи — Имя (имя листа в книге) и АдресВХранилище (адрес табличного документа во временном хранилище).

В отличие от второго варианта файл сохраняется значительно быстрее.

С помощью COM-объекта Excel.Application

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

ТабличныйДокумента.Записать(<ИмяФайла>, <ТипФайлаТаблицы>);

Указав в качестве типа файла таблицы ТипФайлаТабличногоДокумента.XLSX в итоге получим файл Эксель, но в нем мы не увидим привычных листов, соответственно и сохранить несколько табличных документов в одну книгу не получится.

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

  1. Открываем Эксель;
  2. Создаем новую книгу с 1 листом (переменная Книга);
  3. В цикле каждое табличный документ сохраняем в файл с типом xlsx;
  4. Открываем файл с выгруженным табличным документом, и копируем лист в нашу рабочую книгу, вставляя последним листом;
  5. Закрываем временный файл, удаляем из временного хранилища и переходим к следующему табличному документу;
  6. Последним шагом — сохраняем книгу, закрываем эксель.
&НаКлиенте
Процедура СформироватьФайл(ИмяФайла, МассивДанных)		
	ОбъектЭксель = ПолучитьCOMОбъект("", "Excel.Application");
	ОбъектЭксель.SheetsInNewWorkbook = 1; // в новой книге создавать только 1 лист
	ОбъектЭксель.DisplayAlerts = False;
        Книга = ОбъектЭксель.Workbooks.Add();	
	Попытка		
		НомерЛиста = 1;
		Для Каждого ДанныеЛиста Из МассивДанных Цикл			
			АдресВХранилище = ДанныеЛиста["АдресВХранилище"];		
			ТабличныйДокумента = ПолучитьИзВременногоХранилища(АдресВХранилище);			
		 	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    		        ТабличныйДокумента.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);			
			ВременнаяКнига = ОбъектЭксель.Workbooks.Open(ИмяВременногоФайла);
			ЛистИсточник = ВременнаяКнига.WorkSheets(1);
			ЛистИсточник.Copy(Книга.WorkSheets(НомерЛиста));
			Книга.WorkSheets(НомерЛиста).Name = ДанныеЛиста["Имя"];
			ВременнаяКнига.Close(0);			
			УдалитьИзВременногоХранилища(АдресВХранилище);
			НомерЛиста = НомерЛиста + 1;			
		КонецЦикла;		
		Книга.Sheets(НомерЛиста).Delete();		
		ОбъектЭксель.Workbooks(1).Activate();
		Книга.Worksheets(1).Activate();
		Книга.SaveAs(ИмяФайла);	
		Книга.Close(0);		
		ОбъектЭксель.Quit();
		ОбъектЭксель = Неопределено;		
		ПоказатьПредупреждение(,"Файл выгружен в " + ИмяФайла);		
	Исключение		
		ПоказатьПредупреждение(,"Ошибка выгрузки в " + ИмяФайла);
		Сообщить(ОписаниеОшибки());		
		Если ОбъектЭксель <> Неопределено Тогда			
			ОбъектЭксель.Quit();
			ОбъектЭксель = Неопределено;			
		КонецЕсли;		
	КонецПопытки;	
КонецПроцедуры // СформироватьФайл()

6 ответов к «Многостраничный Excel из 1С»

  1. Алексей, спасибо за статью, способ с ПакетОтображаемыхДокументов помог сформировать многостраничный файл Excel.

  2. А не подскажете, как при сохранении через ПакетОтображаемыхДокументов сделать так, чтобы при открытии файла был активен ОДИН коректный лист, а не все имеющиеся сразу?
    Поясню – сохраняем два листа, открываем файл – кнопка фильтр не работает, так как выделены оба листа. Приходится сначала клацать на один лист, потом на первый и тогда всё работает.

    1. Семён, можно попытаться сбросить группировку открыв файл через COM-объект, но видимо вам это не подходит.
      ПакетОтображаемыхДокументов не дает возможности как то редактировать файл.

  3. Благодарю! У клиента Экселя нет а листы нужны были (пустые). ПакетОтображаемыхДокументов помог

  4. Коллега, спасибо. Простецкая заметка, а сэкономила много часов поисков и кропотливого изобретания велосипеда. 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *