пятница, 4 декабря 2015 г.

Экспорт нескольких MXL в один XLS на несколько листов

В ходе одного из проектов всплыло задание: отчёты должны быть скомпонованы в пачки и сохраняться в эксель вместе, каждый отчёт — на отдельный лист в файле. После некоторых происков с экселем и поисков с гуглом появилась обработка.
Алгоритм прост:
  • * открываем эксель,
  • * создаём новый файл,
  • * перебираем в цикле табличные документы:
    • - каждый документ сохраняем в эксель штатными средствами 1С,
    • - открываем файл экселем и
    • - копи-пастим оттуда первый (единственный) лист в наш сводный файл.
  • * сохраняемся, закрываем эксель
Разрабатывалось и тестировалось в условиях MS Office 2007 Standart. Под старые офисы можно и самим допилить. 
В приложенном файле нижеприведённый код и пример его использования.
Исходный код:
// СохранитьМногостраничныйФайл() Создаёт XLSX-файл с несколькими листами
//
// Параметры
//      ИмяФайла            - Имя выходного файла
//      СоответствиеЛистов  -
//                          (1) Соответствие:
//          Ключ            - Строка - Имя листа
//          Значение        - Табличный документ - Содержимое листа
//                          (2) Таблица значений с колонками Ключ и Значение.
//                              Может понадобиться, если требуется строгий порядок листов.
Процедура СохранитьМногостраничныйФайл(ИмяФайлаСоответствиеЛистов) Экспорт 

    
Х ПолучитьCOMОбъект("""Excel.Application");
    
Х.SheetsInNewWorkbook 1// в новой книге создавать только 1 лист
    
Книга Х.Workbooks.Add(); 

    
Первый = Истина; // у нас уже есть один лист, надо использовать его
    
ПрошлыйЛист = Неопределено; 

    Для Каждого 
мЛист Из СоответствиеЛистов Цикл 

        
// Сохраняем табличный документ во временный файл
        
ИмяВременногоФайла ПолучитьИмяВременногоФайла("xlsx");
        
ТабДок мЛист.Значение;
        
ТабДок.Записать(ИмяВременногоФайлаТипФайлаТабличногоДокумента.XLSX); 

        
Х.CutCopyMode = False; // Сбрасываем старое копирование 

        // Копируем первый (единственный) лист временного файла
        
мКнига Х.Workbooks.Open(ИмяВременногоФайла);
        
мКнига.Worksheets(1).Cells.Select();
        
Х.Selection.Copy(); 

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

        
НовыйЛист.Name мЛист.Ключ// Задаём имя
        
НовыйЛист.Paste(); // Вставляем содержимое 

        // Сбрасываем выделение с добавленного листа
        
НовыйЛист.Activate();
        
Х.Range("A1").Select(); 

        
ПрошлыйЛист НовыйЛист;

    КонецЦикла; 
// Для Каждого мЛист Из СоответствиеЛистов Цикл 

    
Х.DisplayAlerts = False; // Отключаем вывод предупреждений типа "Заменить файл?"
    
Книга.Worksheets(1).Activate(); // Активируем 1 лист из списка
    
Книга.SaveAs(ИмяФайла); 

    
Х.Quit();

    
Х = Неопределено; 

КонецПроцедуры 
// СохранитьМногостраничныйФайл()

Комментариев нет:

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