如何在 Jasperreports 中以特定方式将 header、页脚和 table body 拆分为页面

How to split header, footer and table body into pages in specific way in Jasperreports

好朋友!

我对我的报告有非常特殊的要求。先来看报道:

___________
|         |
| header  |
|         |
| row     |
| row     |
| row     |
| footer  |
| footer  |
|_________|

这是我在完美案例中的典型页面,所有行、header 和页脚都在同一页上。有时一页的行太多,我的报告看起来像这样:

__________
|        |
| header |
|        |
| row    |
| row    |
| row    |
| row    |
| row    |
|________|

__________
| row    |
| row    |
| row    |
| row    |
| row    |
| row    |
| row    |
| footer |
|________|

__________
| footer |
|        |
|        |
|        |
|        |
|        |
|        |
|        |
|________|

而且我不能只在最后一行和页脚之间插入分隔符,因为我的要求是: - Headers 页面必须至少有一行 - 页脚必须至少有一行

所以,我找不到解决这个问题的方法。我的页脚可以分成两页。我的页脚可以没有行,这对打印 XLS 文件非常不利。我可以使用 PDF 代替 XLS,但我有同样的问题。有人知道如何解决这个问题吗?

-----===更新===-----

所以,先生。 dada67 提供了很好的解决方案。我们可以将组放入文档中,组将使用表达式 = '1' 执行我们需要的操作(看起来我们 select 所有元素)。但是我的问题有一些更新。

如果我的每一行和子报表中都有一些行怎么办?当我在主报告中使用 group 时,Jasper 将我的每个子报告的所有行都作为一行处理。我可以强制 Jasper 认为单个元素不是整个子报表元素而是子报表中的一行吗?

-----=== 更新 2 ===-----

所以,解决方案就在这里。当您需要将最后一个子报表的最后一行移动到带有一些页脚的下一页时 - 您只需要使用 espression = '1'(以收集所有行)和来自 dada67 的正确答案的设置在子报表内创建组。这会强制 jasper 在每个子报表之后绘制页脚,但您可以在除最后一个之外的所有子报表中隐藏页脚。

感谢dada67!

JasperReports 6.4.3 引入了两个新的组属性,称为 minDetailsToStartFromToppreventOrphanFooter,用于指定组 header 和页脚是否需要伴随一个详细信息带(或更多 headers).

因此您可以在报表中创建一个带有常量表达式的组,设置两个属性并使用组 header 和页脚带。

<group name="Group" minDetailsToStartFromTop="1" preventOrphanFooter="true">
    <groupExpression><![CDATA[1]]></groupExpression>
    <groupHeader>
        ...
    </groupHeader>
    <groupFooter>
        ...
    </groupFooter>
</group>