Выгрузка в несколько листов/файлов Excel в УФ





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

Обработка, демонстрирующая функционал, выдает отчет по остаткам и продажам в УТ11 и сохраняет отчеты по отдельным видам номенклатуры в отдельные листы/файлы.

 

Обработка имеет вид:

 

После выгрузки выдается предупреждение:

 

Если не установлена галочка «Выгружать в Excel», то данные будут выгружаться в отчет:

 

Если выбран переключатель «В отдельные файлы», то выгрузка произойдет в отдельные файлы:

 

 

Если выбран переключатель «В отдельные листы», то выгрузка произойдет в отдельные листы одного файла:

 

 

Код по выгрузке в файлы имеет вид (СписокОтчетов – массив табличных документов):

&НаКлиенте
Процедура СохранитьОтчетыВФайлExcelСЛистами(СписокОтчетов, ИмяФайла) Экспорт
Эксель    = New COMObject("Excel.Application");

Первый = истина;

//Для защиты от дублей имен
СооИмена = Новый СписокЗначений();

//Перебираем отчеты в MXL
Для Каждого Элемент ИЗ СписокОтчетов Цикл
ТабДок = Элемент.Значение;
//ТабДок.Показать();
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("XLS");
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS); //Сохраняем в временный файл

ТекКнига = Эксель.Workbooks.Open(ИмяВременногоФайла);
Если Первый Тогда
Книга = ТекКнига; //Первый файл и есть результат, чтобы сохранялись цвета
Иначе
ТекКнига.Sheets(1).Copy(, Книга.Sheets(Книга.Sheets.Count)); //Copy(Before, After)
КонецЕсли;


//Защита от одинаковых ярлыков
ТекБазаНаименование = Элемент.Представление;
ТекНаименование = ТекБазаНаименование; СчНаименований = 2;
Пока СооИмена.НайтиПоЗначению(ТекНаименование) <> Неопределено Цикл
ТекНаименование = ТекБазаНаименование + "(" + СчНаименований + ")";
СчНаименований = СчНаименований + 1;
КонецЦикла;
СооИмена.Добавить(ТекНаименование);
Книга.Sheets(Книга.Sheets.Count).Name = ТекНаименование; //Переименовываем

Если Первый Тогда
//Делаем доступными ярлыки листов
Эксель.ActiveWindow.DisplayWorkbookTabs = 1;
Эксель.ActiveWindow.TabRatio = 0.6;
Первый = ложь;
Иначе
ТекКнига.Close();
КонецЕсли;

КонецЦикла;

//Удаляем, чтобы не переспрашивал
Файл = Новый Файл(ИмяФайла);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;

Книга.SaveAs(ИмяФайла, -4143); //xlWorkbookNormal -4143 Workbook normal

Книга.Close();

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

&НаКлиенте
Процедура СохранитьОтчетыВФайлыExcel(СписокОтчетов, ИмяФайла) Экспорт
Ф = Новый Файл(ИмяФайла);


//Перебираем отчеты в MXL
Для Каждого КЗ ИЗ СписокОтчетов Цикл
ИмяТекущегоФайла = Ф.Путь + "" + Ф.ИмяБезРасширения + "_" + КЗ.Представление + ".XLS";
КЗ.Значение.Записать(ИмяТекущегоФайла, ТипФайлаТабличногоДокумента.XLS); //Сохраняем в временный файл
КонецЦикла;

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

 

1 Comment

  1. rhtr
    ТекБазаНаименование = Элемент.Представление;

    Заменить на

    ТекБазаНаименование = Лев(Элемент.Представление,30);

    А то в названии книги больше 31 символов нельзя воткнуть.

    Reply

Leave a Comment

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