В ходе одного из проектов всплыло задание: отчёты должны быть скомпонованы в пачки и сохраняться в эксель вместе, каждый отчёт — на отдельный лист в файле. После некоторых происков с экселем и поисков с гуглом появилась обработка.
Алгоритм прост:
- * открываем эксель,
- * создаём новый файл,
- * перебираем в цикле табличные документы:
- - каждый документ сохраняем в эксель штатными средствами 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();
Х = Неопределено;
КонецПроцедуры // СохранитьМногостраничныйФайл()
//
// Параметры
// ИмяФайла - Имя выходного файла
// СоответствиеЛистов -
// (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();
Х = Неопределено;
КонецПроцедуры // СохранитьМногостраничныйФайл()
Комментариев нет:
Отправить комментарий