报告包含一个独特的中央“Detail1”区域,必须适合整个页面高度 - 即使数据源只提供一条记录 - 页脚必须保留在A4大小页面的底部:
_______________
| header |
| |
| row1 |
| row2 |
| |
| |
| |
| |
| |
| footer |
|_______________|
YES!
_______________
| header |
| |
| row1 |
| row2 |
| footer |
|_______________|
NO!
我想知道这是与“拉伸”选项有关还是与背景有关。
答案 0 :(得分:1)
我们还有一个更普遍的问题,即相对于页面高度垂直调整某些波段或内容的大小。
在你的情况下,它可以完成,例如,通过增加row2
"底部边距"或footer
"上边距" (或介绍一些" spacer元素" inbetween):
variant A variant B variant C
___________ __________ __________
| header | | header | | header |
|_________| |________| |________|
| row1 | | row1 | | row1 |
|_________| |________| |________|
| row2 | | row2 | | row2 |
| . | |________| |________|
| . | | . | | spacer |
|_________| | . | |________|
| footer | | footer | | footer |
|_________| |________| |________|
我目前能想到解决这个问题的唯一方法是一种黑客,如果"你对已经拉伸的元素兄弟姐妹的大小了解得足够多了#34; 强>:
我们想要设置spacer.height
(或保证金取决于所选的变体),如下所示:
spacer.height = page.height - header.height - row1.height - row2.height - footer.height
为了简单起见,我们假设
row2.height
是灵活的(〜动态)为简单起见,我们说row2.height
由数字分隔的数字组成,如下所示:
17
2
34
使用 variant A
,我们可以手动测试,在下一页上推送页脚的行数/数量后,让我们说{{1} } 强>
所以我们所要做的就是
5
的底部边距为row2
(例如,通过Groovy或Java)max( 0, 5 - row2LinefeedsCount * row2lineHeight )
另一个例子可能是, -- (Oracle SQL)
select
...,
dyn_row2_col
-- add additional linefeeds if necessary (when < 5 lines)
-- (counts by the content length after removing all digits)
|| lpad(
'',
max( 0, 5 - length( regexp_replace( dyn_row2_col, '\d', '' ))),
CHR(13) )
as dyn_row2_col,
...
from ...
的高度是相关的,并且线性地增加了一些查询结果的子行数(例如,如果它是具有相同大小的行的简单子报告)。然后我们可以使用 row2
和根据子行查询填充间隔(无形)和一些虚拟查询(并且计算剩余空间类似上面的例子)。
将条带高度调整为页面大小/高度,条带高度为页面大小的100%,最大高度,垂直拉伸至100%父容器高度或页面大小
我发现痛苦,不能轻易使用灵活的定位/大小调整表达式(例如让页脚粘到底部,浮动元素在这个现代的flex布局HTML /响应式布局世界中,使用Jasper Reports水平(例如表格列)或variant C
)。绝对定位理念应该在这里得到加强。 Eclipse BIRT 在这方面要好得多,但还有其他缺点。 当然,实施可能相当复杂,内存更紧密,速度更慢,但我认为非绝对定位要求场景的好处会很大。
我写了一些通用的Scriptlet(我打算在 jasper-utils 中提供),它解决了相关列上基于命名组件样式(类似于CSS类)的水平列的浮动。它的行为与HTML表格非常相似,使用基于列特定百分比的可用水平空间和&#34; underflow-stretch-calc&#34;表达式和显示/隐藏列的可能性(在所有相关频段上)。