使用 JasperReports 详细信息带调整页面高度
Fit page height with JasperReports detail band
报表包含一个独特的中央 "Detail1" 条带,该条带必须适合整个页面高度——即使数据源只提供一条记录——页脚必须保留在 A4 尺寸页面的底部:
_______________
| header |
| |
| row1 |
| row2 |
| |
| |
| |
| |
| |
| footer |
|_______________|
YES!
_______________
| header |
| |
| row1 |
| row2 |
| footer |
|_______________|
NO!
我想知道这是否与 "stretching" 选项有关或与背景有关。
我们还有一个更普遍的问题,即相对于页面高度垂直调整某些区域或内容的大小。
在你的情况下,它可以完成,例如通过增加 row2
"bottom margin" 或 footer
"top margin"(或在其间引入一些 "spacer element"):
variant A variant B variant C
___________ __________ __________
| header | | header | | header |
|_________| |________| |________|
| row1 | | row1 | | row1 |
|_________| |________| |________|
| row2 | | row2 | | row2 |
| . | |________| |________|
| . | | . | | spacer |
|_________| | . | |________|
| footer | | footer | | footer |
|_________| |________| |________|
我目前能想到的解决这个问题的唯一方法是 一种 hack,如果 "you know enough about the size of the to-be-streched element siblings":
我们想像这样设置 spacer.height
(或边距取决于所选的变体):
spacer.height = page.height - header.height - row1.height - row2.height - footer.height
示例 A
为了简单起见,我们假设
- 只有
row2.height
灵活(~动态)
为简单起见,我们假设 row2.height
由这样的换行符分隔的数字组成:
17
2
34
使用variant A
我们可以手动测试,多少linefeeds/numbers页脚会被推到下一页,让我们说 5
.
所以我们要做的就是
- 动态调整
row2
的下边距为 max( 0, 5 - row2LinefeedsCount * row2lineHeight )
(例如通过 Groovy 或 Java)
- 或者如果它是基于一些 SQL select,像这样填写一些空白 space 行:
-- (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 ...
示例 B
另一个例子可能是,row2
s 的高度是相关的,并且随着某些查询结果的子行数线性增加(例如,如果它是一个具有相同大小行的简单子报表)。然后我们可以使用 variant C
和 用一些基于子行的虚拟查询 填充 spacer(无形地)查询(并进行其余的计算 space 类似于上面的例子)。
搜索引擎tags/phrases
使条带高度适合页面 size/height,条带高度为页面大小的 100%,最大高度,垂直拉伸至父容器高度或页面大小的 100%
implementation/usage Jasper Reports 的想法
我发现无法轻松使用灵活的 positioning/sizing 表达式(例如 让页脚贴在底部、水平浮动元素(例如 table 列)或 spacer.height: 75%
)在这个现代弹性布局 HTML/responsive 布局世界中使用 Jasper Reports。这里应该加强绝对定位理念。 Eclipse BIRT 在这方面要好得多,但还有其他缺点。 当然实现起来可能比较复杂,内存比较大,速度也比较慢,但是我觉得在非绝对定位需求场景下好处会很大
写了一些通用的Scriptlet(打算在jasper-utils中提供),解决了基于命名组件样式的水平列的浮动(类似CSS 类) 在相关栏目上。它的行为与 HTML tables 非常相似,使用基于列特定百分比和 "underflow-stretch-calc" 表达式的可用水平 space 以及 show/hide 列的可能性(在所有相关频段上)。
报表包含一个独特的中央 "Detail1" 条带,该条带必须适合整个页面高度——即使数据源只提供一条记录——页脚必须保留在 A4 尺寸页面的底部:
_______________
| header |
| |
| row1 |
| row2 |
| |
| |
| |
| |
| |
| footer |
|_______________|
YES!
_______________
| header |
| |
| row1 |
| row2 |
| footer |
|_______________|
NO!
我想知道这是否与 "stretching" 选项有关或与背景有关。
我们还有一个更普遍的问题,即相对于页面高度垂直调整某些区域或内容的大小。
在你的情况下,它可以完成,例如通过增加 row2
"bottom margin" 或 footer
"top margin"(或在其间引入一些 "spacer element"):
variant A variant B variant C
___________ __________ __________
| header | | header | | header |
|_________| |________| |________|
| row1 | | row1 | | row1 |
|_________| |________| |________|
| row2 | | row2 | | row2 |
| . | |________| |________|
| . | | . | | spacer |
|_________| | . | |________|
| footer | | footer | | footer |
|_________| |________| |________|
我目前能想到的解决这个问题的唯一方法是 一种 hack,如果 "you know enough about the size of the to-be-streched element siblings":
我们想像这样设置 spacer.height
(或边距取决于所选的变体):
spacer.height = page.height - header.height - row1.height - row2.height - footer.height
示例 A
为了简单起见,我们假设
- 只有
row2.height
灵活(~动态) 为简单起见,我们假设
row2.height
由这样的换行符分隔的数字组成:17 2 34
使用variant A
我们可以手动测试,多少linefeeds/numbers页脚会被推到下一页,让我们说 5
.
所以我们要做的就是
- 动态调整
row2
的下边距为max( 0, 5 - row2LinefeedsCount * row2lineHeight )
(例如通过 Groovy 或 Java) - 或者如果它是基于一些 SQL select,像这样填写一些空白 space 行:
-- (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 ...
示例 B
另一个例子可能是,row2
s 的高度是相关的,并且随着某些查询结果的子行数线性增加(例如,如果它是一个具有相同大小行的简单子报表)。然后我们可以使用 variant C
和 用一些基于子行的虚拟查询 填充 spacer(无形地)查询(并进行其余的计算 space 类似于上面的例子)。
搜索引擎tags/phrases
使条带高度适合页面 size/height,条带高度为页面大小的 100%,最大高度,垂直拉伸至父容器高度或页面大小的 100%
implementation/usage Jasper Reports 的想法
我发现无法轻松使用灵活的 positioning/sizing 表达式(例如 让页脚贴在底部、水平浮动元素(例如 table 列)或 spacer.height: 75%
)在这个现代弹性布局 HTML/responsive 布局世界中使用 Jasper Reports。这里应该加强绝对定位理念。 Eclipse BIRT 在这方面要好得多,但还有其他缺点。 当然实现起来可能比较复杂,内存比较大,速度也比较慢,但是我觉得在非绝对定位需求场景下好处会很大
写了一些通用的Scriptlet(打算在jasper-utils中提供),解决了基于命名组件样式的水平列的浮动(类似CSS 类) 在相关栏目上。它的行为与 HTML tables 非常相似,使用基于列特定百分比和 "underflow-stretch-calc" 表达式的可用水平 space 以及 show/hide 列的可能性(在所有相关频段上)。