【问题标题】:How to avoid null values in jasper reports如何避免碧玉报告中的空值
【发布时间】:2010-07-05 05:10:24
【问题描述】:

我的 jasper 报告中有一个字段,其表达式值类似于

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

我的问题是,如果这里的任何字段为空,我会在其他内容之间得到空值,例如

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

注意突出显示的空值。有什么办法可以避免吗?

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

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

    将属性isBlankWhenNull 设置为true。

    • 在 iReport 中,选中您的字段时选中空白时为空复选框。
    • 在 jasper jrxml 文件中:<textField isBlankWhenNull="true">

    【讨论】:

    • 它不起作用,因为我的总字段(这是多个单独字段的串联)不为空,只是字段的一部分为空,我想避免
    • 这个答案涵盖了一个非常常见的问题......但它不包括这里提出的问题。尽管问题中没有足够的信息可以确定,但将报告语言从“Groovy”更改为“Java”可能就足够了。
    • 具体问题不正确!阅读下面的答案stackoverflow.com/a/3186360/1241276
    • 这不是问题的答案。我不明白人们是如何如此赞成这个答案的。
    【解决方案2】:

    在表达式中您可以使用 Java 代码。

    所以你需要做的是检查字段的值为 null if 然后用空字符串替换它。

    $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}
    

    【讨论】:

    • 提醒任何仍在 IReport 3.7.4 中的人,这不起作用。出于某种原因 ($F{field} == null ? x : y) 返回 null(在 java 三元运算符中被转换为 false)。
    【解决方案3】:

    @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})
    

    【讨论】:

    • 我已经这样做了很长时间,但我希望有人有一个不那么冗长的解决方案。
    • 对我来说也更好:没有括号我有 jrxml 编译问题
    【解决方案4】:

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

    T($F{firstName})

    【讨论】:

      【解决方案5】:

      要首先解决这个问题,请检查字段属性 Blank when null 复选框中的 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}
      

      【讨论】:

        【解决方案6】:
        ($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})
        

        【讨论】:

          【解决方案7】:

          尝试以下操作:

          $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}
          

          或者 设置报告属性: 资源缺失时类型:Type Empty

          两者都适用于我的情况。

          【讨论】:

            【解决方案8】:

            我有选项(空时为空)检查报告中的每个字段,但仍然看到字段上的空值。所以,我使用了报表表达式。

            由于每个报告变量都是一个字符串,所以要检查是否为空:

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

            【讨论】:

              【解决方案9】:

              如果您在 ecliple+jasper softReports 中工作,您只需按照以下步骤进行操作 1.选择字段+右键并选择showProperties选项 2.点击TextField选择BlankWhenNull 3.Compile and Rebuild检查一下。

              【讨论】:

                【解决方案10】:

                我有类似的情况,如果我有 null 参数,我想避免在输出中显示 null
                我在表达式编辑器中使用T($P{city}),如果您没有将参数传递给它,它会评估为 empty 字符串

                T() 如果值为字符串,则返回文本字符串,否则为空 返回字符串

                示例用法:

                $P{name} + " " + (T($P{city}).isEmpty() ? "" : " from " )+ (T($P{city}).isEmpty() ? "" : "\"" +  T($P{city}) + "\"")
                

                如果我将参数传递给 $P{city}
                结果是:

                来自“利雅得”的abdulkahliq

                如果我不向 $P{city} 传递参数,结果是:

                阿卜杜勒卡利克

                感谢和问候,

                【讨论】:

                  【解决方案11】:

                  您可以创建一个新的样式
                  将其标记为Default Style
                  转到:高级>空时空白> true
                  就是这样!

                  所有 TextField 都将“继承”此设置
                  (除非他们“触及”了这个属性。right-click > Reset To Default

                  【讨论】:

                    【解决方案12】:

                    你可以写一个java代码

                     package com.xyz
                    
                     Class ReportUtil 
                      {
                          public static String getMyString (String str1 , String str2)
                             {
                                 if((str1!=null) && (str2!=null))
                                     return str1 + " " + str2 ;
                                 else if str1==null
                                      return str2 ; 
                                 return str1 ;                            
                              }
                    
                       }
                    

                    在 JRXML 中,您可以在文本框中使用以下表达式

                    com.xyx.ReportUtil.getMyString ($F{firstName},$F{lastName}) 
                    

                    将“为空时为空”属性设置为 true

                    问候,

                    安库什

                    【讨论】:

                      【解决方案13】:

                      如果 您的字段是字符串,只需勾选(空白时为空)上的属性。 否则使用三元运算符

                      如果 null 打印其他内容,则打印该字段。

                      field==null?whatever:field 
                      field=null?false:true
                      

                      这两个都应该解决问题。

                      【讨论】:

                        【解决方案14】:

                        您可以将文本字段高度设置为 1, 将带有溢出标志的 Stretch 设置为 true,将 null 设置为 true,这样当字段值为空白时,不会在两者之间留下空格。

                        【讨论】:

                          【解决方案15】:
                          ($F{address_street1} + " " + $F{address_street2} + " " + $F{address_state} + " " +
                              $F{address_country} + " " + $F{address_zip}).replaceAll("null", "")
                          

                          【讨论】:

                          • 请更好地格式化并解释为什么这是答案。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-03-25
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多