Многостраничный 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();
			ОбъектЭксель = Неопределено;
			
		КонецЕсли;
		
	КонецПопытки;
	
КонецПроцедуры // СформироватьФайл()

3 комментария

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

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

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

Оставить комментарий

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