Многостраничный Excel из 1С
В последнее время мне очень часто приходится работать с таблицами Excel из 1С. Это первая статья, посвященная работе с Excel из 1С и в ней я покажу как сохранять несколько табличный документов в одном, многостраничном файле Excel.
С помощью объекта ПакетОтображаемыхДокументов
Начиная с версии 8.3.3 платформы 1С реализован объект ПакетОтображаемыхДокументов, через который и реализована печать во всех современных типовых конфигурациях. С помощью этого объекта очень легко сформировать многостраничную книгу Excel, т.е. каждый табличный документ выводится на своем листе.
// Сохраняет табличные документы в файл Эксель // // Параметры: // ИмяФайла — Строка — указывающая имя сохраняемого файла. // Можно включить полный путь; // МассивДанных — Массив — массив соответствий: // * ДанныеЛиста — соответствие: // ** АдресВХранилище — адрес табличного документа во временном хранилище // ** Имя — имя листа. // &НаКлиенте Процедура СформироватьФайлПакетом(ИмяФайла, МассивДанных) Пакет = Новый ПакетОтображаемыхДокументов; Для Каждого ДанныеЛиста Из МассивДанных Цикл АдресВХранилище = ДанныеЛиста[«АдресВХранилище»]; ЭлементПакета = Пакет.Состав.Добавить(); ЭлементПакета.Наименование = ДанныеЛиста[«Имя»]; ЭлементПакета.Данные = АдресВХранилище; КонецЦикла; Попытка Пакет.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX); ПоказатьПредупреждение(, «Файл выгружен в « + ИмяФайла); Исключение ПоказатьПредупреждение(,«Ошибка выгрузки в « + ИмяФайла); Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры // СформироватьФайлПакетом()
ИмяФайла – имя файла в который будет сохранена книга. Можно перед вызовом функции предлагать пользователю указать каталог, куда будет сохраняться файл, и в параметр передать полный путь до файла, например “D:\Файлы\МойФайлЭксель.xlsx”.
МассивДанных — массив соответствий с данными для формирования книги. Массив собираю на сервере. Соответствие представляет из себя коллекцию значений в связки с ключем. Ключи — Имя (имя листа в книге) и АдресВХранилище (адрес табличного документа во временном хранилище).
В отличие от второго варианта файл сохраняется значительно быстрее.
С помощью COM-объекта Excel.Application
Этот вариант подойдет тем, кому приходится работать со старыми версиями платформы. 1С позволяет сохранять табличный документ в эксель:
ТабличныйДокумента.Записать(<ИмяФайла>, <ТипФайлаТаблицы>);
Указав в качестве типа файла таблицы ТипФайлаТабличногоДокумента.XLSX в итоге получим файл Эксель, но в нем мы не увидим привычных листов, соответственно и сохранить несколько табличных документов в одну книгу не получится.
В результате изучения проблемы и поисков в интернете, родился следующий алгоритм, который был реализован в качестве процедуры:
- Открываем Эксель;
- Создаем новую книгу с 1 листом (переменная Книга);
- В цикле каждое табличный документ сохраняем в файл с типом xlsx;
- Открываем файл с выгруженным табличным документом, и копируем лист в нашу рабочую книгу, вставляя последним листом;
- Закрываем временный файл, удаляем из временного хранилища и переходим к следующему табличному документу;
- Последним шагом — сохраняем книгу, закрываем эксель.
&НаКлиенте Процедура СформироватьФайл(ИмяФайла, МассивДанных) ОбъектЭксель = Получить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(); ОбъектЭксель = Неопределено; КонецЕсли; КонецПопытки; КонецПроцедуры // СформироватьФайл()
Алексей, спасибо за статью, способ с ПакетОтображаемыхДокументов помог сформировать многостраничный файл Excel.
А не подскажете, как при сохранении через ПакетОтображаемыхДокументов сделать так, чтобы при открытии файла был активен ОДИН коректный лист, а не все имеющиеся сразу?
Поясню – сохраняем два листа, открываем файл – кнопка фильтр не работает, так как выделены оба листа. Приходится сначала клацать на один лист, потом на первый и тогда всё работает.
Семён, можно попытаться сбросить группировку открыв файл через COM-объект, но видимо вам это не подходит.
ПакетОтображаемыхДокументов не дает возможности как то редактировать файл.
Благодарю! У клиента Экселя нет а листы нужны были (пустые). ПакетОтображаемыхДокументов помог
Всё получилось, спасибо!
Коллега, спасибо. Простецкая заметка, а сэкономила много часов поисков и кропотливого изобретания велосипеда. 🙂