Jasper Report 如何避免 print when expression 产生空白记录?
结论
printWhenExpression 只决定 TOTAL 元素是否显示,不会删除当前数据记录,也不会隐藏它所在的 Detail band。条件为 false 时,TOTAL 不会打印,但报表仍会为这条记录保留一行空间。
如果整条记录都不需要显示,应在 Detail band 上设置条件,或直接在数据集中过滤记录。如果只需隐藏 TOTAL,并回收它占用的局部空间,可以启用 Remove Line When Blank。这种方式不会删除整条明细记录。
方案一:不打印整条空白记录
如果不符合条件的记录不应出现在报表中,请选中 Detail band,并在它的 Print When Expression 中设置条件:
"Cash Refund".equals($F{PAYMENT})
对应的 JRXML 类似:
<detail>
<band height="20">
<printWhenExpression><![CDATA[
"Cash Refund".equals($F{PAYMENT})
]]></printWhenExpression>
<!-- TOTAL 等明细元素 -->
</band>
</detail>
条件为 false 时,整个 Detail band 都不会打印,因此不会留下空白记录。
建议把常量放在 .equals() 前面,这样即使 PAYMENT 为 null,也不会出现 NullPointerException:
"Cash Refund".equals($F{PAYMENT})
不要写成:
$F{PAYMENT}.equals("Cash Refund")
方案二:仅在 TOTAL 有值时打印整条记录
如果是否打印记录取决于 TOTAL 有没有有效值,可以把下面的表达式设置到 Detail band:
$F{TOTAL} != null
如果 TOTAL 是字符串,还需要排除空字符串以及只包含空格的值:
$F{TOTAL} != null && !$F{TOTAL}.trim().isEmpty()
TOTAL 文本字段也可以使用相同的条件:
$F{TOTAL} != null && !$F{TOTAL}.trim().isEmpty()
在 Jasper Studio 中按以下步骤设置:
- 在报表设计区选中
Detailband,不要选TOTAL文本字段。 - 打开
Properties面板。 - 找到
Print When Expression。 - 填入判断表达式。
- 重新预览报表,确认不符合条件的明细行已经被跳过。
方案三:保留记录,只回收 TOTAL 的空白区域
如果同一条记录中的其他字段仍需显示,只想隐藏 TOTAL,可以保留字段级的 printWhenExpression,并为 TOTAL 启用:
Remove Line When Blank = true
JRXML 示例:
<textField isBlankWhenNull="true">
<reportElement
x="0"
y="0"
width="100"
height="20"
isRemoveLineWhenBlank="true"/>
<printWhenExpression><![CDATA[
$F{TOTAL} != null && !$F{TOTAL}.trim().isEmpty()
]]></printWhenExpression>
<textFieldExpression><![CDATA[$F{TOTAL}]]></textFieldExpression>
</textField>
Remove Line When Blank 只能尝试回收该元素占用的空白区域。如果同一水平区域还有其他元素,或有其他元素与它重叠,这部分空间通常无法移除。必要时,可以把下方元素的 Position Type 设置为 Float,让它们能够向上移动。
字符串比较的注意事项
String.equals() 区分大小写和空格。下面三个字符串并不相等:
cashrefund
Cash Refund
Cash refund
如果数据中的实际值是 Cash Refund,应直接按真实值比较:
"Cash Refund".equals($F{PAYMENT})
需要忽略大小写时,可以使用:
"Cash Refund".equalsIgnoreCase($F{PAYMENT})
如果还要忽略首尾空格,可以写成:
$F{PAYMENT} != null
&& "Cash Refund".equalsIgnoreCase($F{PAYMENT}.trim())
三元表达式在这里没有必要:
$F{PAYMENT}.equals("cashrefund") ? true : false
直接使用布尔表达式即可:
"cashrefund".equals($F{PAYMENT})
要消除整条空白记录,应控制 Detail band 是否打印。字段级的 printWhenExpression 只能隐藏字段本身。
备注:内容仅供参考。
