При разработке печатной формы средствами платформы 1С:Предприятие есть возможность повторять при печати строки (заголовка, например) на каждом листе. Все просто, проблем нет. Заголовок повторяется на каждой странице. То же самое реализуется и в ПО Excel.
Когда возникла необходимость выполнить повторение заголовков на каждом листе при подготовке к печати файла Excel, формируемого программой, работающей в системе 1С, пришлось потратить много времени на поиск необходимой информации. Безуспешно. Возможно, я плохо искал и еще надо было покурить мануал по методам Excel.
Расставить заголовки можно программно, последовательно измеряя высоту строк. Недостатки у данного метода, конечно, есть:
- Редактирование файла приведет к смещению заголовков. Решение: так же, программно, можно убрать заголовки и расставить их вновь.
- Изменение масштаба, либо отступов приведет к смещению заголовков и повторная расстановка заголовков уже не поможет. Необходимо задать новую высоту страницы. В принципе, ее можно рассчитать, либо подобрать.
Можно вообще для вывода использовать уже настроенный файл-шаблон Excel.
Но, если формируемый документ является отчетом, не предназначенным к дальнейшему изменению вручную, либо файл передается для последующего вывода на печать, стоит отдать предпочтение предлагаемому предельно простому методу.
Приведенный ниже программный код прост и понятно закомментирован. Если будете расставлять заголовки в только что сформированном документе, предварительно сохраните его, иначе метод Excel неправильно определяет высоту строки.
Надеюсь, приведенный пример будет полезен.
НомерКопируемойCтроки = 2;
Попытка Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Программа EXCEL не установлена на этом компьютере!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
РасположениеФайла = "C:\";
ПолноеИмяФайла = РасположениеФайла + "ТестовыйФайл.xlsx";
Попытка
Book = Excel.WorkBooks.Open(ПолноеИмяФайла);
Исключение
Сообщить("Не найден файл" + ПолноеИмяФайла);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ТекЛист = Book.WorkSheets(1);
ОбщаяВысота = 0;
Для СтЧ = 1 по ТекЛист.UsedRange.Rows.Count + 1 Цикл //Цикл по всем строкам файла.
ОбщаяВысота = ОбщаяВысота + ТекЛист.Cells(СтЧ, 1).RowHeight; //Последовательно перебираем строки и считаем их высоту.
Если ОбщаяВысота > 465 Тогда //Если при добавлении высоты очередной строки общая высота строк текущей страницы превысит 465,
//вставляем разрыв страницы и повторяющиеся строки перед этой очередной строкой до 465 и вставляем
//строку для повтора. Высота задается в единицах Escel, в которых измеряется высота строки.
//Высота 465 подобрана для альбомной ориентации со стандартными отступами и масштабом 100 проц.
//При масштабировании и изменении полей эту величину необходимо корректировать.
Сообщить("Высота страницы превышена, включая строку № " +СтЧ+" Вставляем повторяющуюся строку в " + СтЧ);
ТекЛист.Rows(НомерКопируемойCтроки).Copy(); //копирование строки для повтора.
ТекЛист.Rows(СтЧ).Insert(); //Вставка повторяющейся строки.
ТекЛист.HPageBreaks.Add(ТекЛист.Rows(СтЧ));//Вставляем разрыв страницы.
ОбщаяВысота = 0; // Обнуляем счетчик высоты для подсчета высоты строк на следующей странице.
КонецЕсли;
КонецЦикла;
Попытка
Book.Save();
Сообщить("Файл " + " " + " успешно сохранен");
Исключение
Сообщить(ОписаниеОшибки() + " Файл не сохранен!");
КонецПопытки;
Book.Close();
Excel.Quit();
//При необходимости можно задать параметры страницы.
ТекЛист.PageSetup.Orientation = 2;//1 - книжная, 2 - альбомная.
ТекЛист.PageSetup.LeftMargin = Excel.CentimetersToPoints(2/10); //Отступы.
ТекЛист.PageSetup.RightMargin = Excel.CentimetersToPoints(2/10);
ТекЛист.PageSetup.TopMargin = Excel.CentimetersToPoints(2/10);
ТекЛист.PageSetup.BottomMargin = Excel.CentimetersToPoints(2/10);
ТекЛист.PageSetup.FitToPagesWide = 1; //По ширине листа
ТекЛист.PageSetup.FitToPagesTall = False; //Нет привязки по количеству строниц по высоте
ТекЛист.PageSetup.Zoom = 100; //Задаем масштабирование.