如何在Jasper报表中避免空值

33

我在Jasper报表中有一个字段,其表达式值如下:

$F{address_street1}+" "+$F{address_street2}+ " " +$F{address_state} + " "+$F{address_country}+ " "+$F{address_zip}

我的问题是,如果这里的任何一个字段为空,那么我会得到null值,这会和其他内容一起出现。

101 Main St****null****ILUnited States12345 

注意到了那个高亮的null。有没有办法避免它出现?

我尝试使用布尔表达式检查其中一个字段的null值并将其替换为空白,但似乎不起作用。

15个回答

46

将属性 isBlankWhenNull 设置为 true。

  • 在 iReport 中选择您的字段时,勾选“当为空时空白”复选框。
  • 在 Jasper JRXML 文件中:<textField isBlankWhenNull="true">

7
它无法工作,因为我的总字段(它是多个单独字段的串联)仅部分为空,而我想避免这种情况。 - Sachin Anand
5
这个回答涵盖了一个非常常见的问题...但它并没有回答这里所提出的问题。虽然问题中的信息不足以确定,但很可能只需将报告语言从“Groovy”更改为“Java”即可。 - mdahlman
1
请勿使用此答案,这不是针对特定问题的正确答案! - lory105
我不明白为什么这个答案会得到那么多赞,因为它并没有回答问题。 - Cem U

44
在这个表达式中,你可以使用Java代码。因此,你需要检查字段的值是否为null,如果是,则用空字符串替换它。
$F{address_street1} == null ? "" : $F{address_street1}+ " " +
$F{address_street2} == null ? "" : $F{address_street2}+ " " +
$F{address_state} == null ? "" : $F{address_state}  + " " +
$F{address_country} == null ? "" : $F{address_country}+ " " +
$F{address_zip} == null ? "" : $F{address_zip}

3
提醒那些仍在使用IReport 3.7.4的人,这个方法不起作用。由于某些原因($F{field} == null ? x : y)返回null(在Java三元操作符中被翻译为false)。请注意。 - Brennen Sprimont

13

@Vash,是的,这就是我要做的,只是我认为你可能想将每个表达式都放在括号里,以便每个表达式都独立于其他表达式。像这样:

($F{address_street1} == null ? "" : $F{address_street1}+ " ") +
($F{address_street2} == null ? "" : $F{address_street2}+ " ") +
($F{address_state} == null ? "" : $F{address_state}  + " ") +
($F{address_country} == null ? "" : $F{address_country}+ " ") +
($F{address_zip} == null ? "" : $F{address_zip})

2
我已经做这个有一段时间了,但我希望有人能提供一个更简洁的解决方案。 - Alexander Ljungberg
1
对我来说更好,没有括号我就不会遇到jrxml编译问题。 - Falco

10

如果你会使用 jasperreports-functions 并且想要输出字符串值,可以使用函数 T(),它返回文本字符串或空字符串。

T($F{firstName})


7

要解决这个问题,首先检查IReport中字段属性的“当为空时为空白”复选框,或者Jasper jrxml文件中是否有<textField isBlankWhenNull="true">

然后我找到了两种方法来解决这个问题。选择以下其中一种方法。
1. 使用如下表达式语法:

$F{variableName}.equals( "0" )? "" : $F{variableName}

你可以使用如下代码:

$F{address_street1}.equals("0")? "" : $F{address_street1} + " " +  
$F{address_street2}.equals("0")? "" : $F{address_street2} + " " +
$F{address_state}.equals("0")? "" : $F{address_state} + " " +  
$F{address_country}.equals("0")? "" : $F{address_country} + " " +
$F{address_zip}.equals("0")? "" : $F{address_zip}

2. 使用以下表达式语法:

$F{variableName}== null ? "" : $F{variableName}

你可以使用以下代码:

$F{address_street1} == null ? "" : $F{address_street1} + " " +  
$F{address_street2} == null ? "" : $F{address_street2} + " " +
$F{address_state} == null ? "" : $F{address_state} + " " +  
$F{address_country} == null ? "" : $F{address_country} + " " +
$F{address_zip} == null ? "" : $F{address_zip}

3

请尝试以下操作:

$F{address_street1}.toString() == null ? "" : $F{address_street1}+ " " +
$F{address_street2}.toString() == null ? "" : $F{address_street2}+ " " +
$F{address_state}.toString() == null ? "" : $F{address_state}  + " " +
$F{address_country}.toString() == null ? "" : $F{address_country}+ " " +
$F{address_zip}.toString() == null ? "" : $F{address_zip}

或者设置报告属性: 当资源缺失类型: 类型为空

在我的情况下,两个都可以。


3
($F{address_street1}.equals(null) ? "" : $F{address_street1}+ " ") + 
($F{address_street2}.equals(null)l ? "" : $F{address_street2}+ " ") +
($F{address_state}.equals(null) ? "" : $F{address_state}  + " ") +            
($F{address_country}.equals(null) ? "" : $F{address_country}+ " ") +           
($F{address_zip} .equals(null) ? "" : $F{address_zip})

1
如果您正在使用ecliple+jasper softReports,只需按照以下步骤操作: 1.选择字段+右键单击并选择showProperties选项 2.单击TextField选择BlankWhenNull 3.编译和重建检查它。

1
你可以创建一个新的样式,将其标记为默认样式,然后转到:高级 > 当为空时为空白 >true。就这样!所有的文本字段都会“继承”这个设置(除非它们“触摸”了此属性。右键单击 >重置为默认值)。

1

我已经为报表中的每个字段选中了"为空时空白"的选项,但仍然看到字段上的空值。因此,我使用了报表表达式。

由于每个报表变量都是字符串,要检查是否为空,请使用:

$F{address_stree2}.equals("null") 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接