Ольга, добрый день.
В XLSX-файле бывают переносы строк Автоматические и Ручные (принудительные).
1) Автоматические переносы не хранятся в файле, они рассчитываются и расставляются приложением MS Excel в момент открытия, руководствуясь его внутренними алгоритмами, основываясь на установках принтера у конкретного пользователя, на высоте строк (а если задан автоматический подбор высоты строк по содержимому, то высота строки тоже заранее не известна) и ещё каких-то параметрах. Повлиять на такие переносы нет возможности. Можно их только убрать/перенести (посредством VBA/OLE) уже после открытия файла в MS Excel.
По этому, если у Вас строки табличной части имеют разную высоту, то невозможно заранее спрогнозировать на какой именно строке Эксель решит вставить автоматический разрыв и здесь без макросов не обойтись.
2) Ручные переносы строк хранятся в файле , а значит, их можно вставлять без участия приложения MS Excel (т.е. без макроса). Эта возможность реализована в компоненте
«Папка», пункте «Вставить разрыв страницы (в начале)». Вы можете воспользоваться этой опцией, в том случае, если все позиции табличной части будут иметь одинаковую высоту (это важно). Тогда можно заранее рассчитать сколько позиций табличной части войдет на одну страницу (например, 10).
Идея в том, что если заранее расставить ручные переносы строк везде, где это необходимо, то в автоматических переносах строк не возникнет необходимости.
Схема действий такая:
- Контекст будет содержать таблицу №1, соответствующую страницам; а в каждой строке этой таблицы будет вложенная таблица №2, соответствующая позициям, размещающимся на этой странице (т.е. 10 позиций). Кроме того, в контексте будет ещё одна структура, соответствующая последней позиции (№3).
- В программе печати нужно делить весь выводимый массив позиций на порции по 10 штук и для каждой порции создавать новую запись в таблице №1 контекста (страницы), и помещать их в таблицу №2.
- страница 1 (строка таблицы №1)
- позиция 1
(строка таблицы №2)
- позиция 2
(строка таблицы №2)
- позиция 3
(строка таблицы №2)
- ...
- позиция 10
(строка таблицы №2)
- страница 2
(строка таблицы №1)
- позиция 1
(строка таблицы №2)
- позиция 2
(строка таблицы №2)
- позиция 3
(строка таблицы №2)
- ...
- позиция 10
(строка таблицы №2)
- страница ...
- страница (последняя)
Если последняя позиция, которую требуется вывести, вдруг окажется 10-й по счету (на последней странице), значит, её нужно убрать из таблицы №2 контекста и переложить в структуру №3 (в остальных случаях эта структура будет пустая.
- В формуляре нужно создать два Цикла (один вложен в другой) и связать их с таблицами №1 и №2.
Цикл №2 нужно заключить в Папку и включить в ней опцию «Вставить разрыв страницы (в начале)». В результате, перед каждыми 10-ю позициями будет вставляться Ручной перенос страницы.
Кроме того, нужно создать Паттерн с итоговой строкой в двух вариантах: Первый вариант - с присоединенной последней позицией из структуры (№3) и заключенный в папку с включенной опцией «Вставить разрыв страницы (в начале)». Второй вариант - просто итоговая строка без последней позиции и без папки. Вывод первого или второго варианта задаем условием наличия значения в структуре (№3) через пункт Пункт «Появление при выводе».
С уважением,
Игорь Бородин
четверг, 20 мая 2021 г. в 09:50:33 UTC+3, Ольга Заболотская: