使用带表达式的条件表达式时,如何在JasperReports中获取当前元素?

时间:2016-10-26 06:38:00

标签: jasper-reports

当单元格的数值小于零时,我想让textValue中的文本变为红色。目前我的配置是这样的:

<style name="RedText">
    <conditionalStyle>
        <conditionExpression><![CDATA[$F{col1}.compareTo(BigDecimal.ZERO) == -1]]></conditionExpression>
        <style forecolor="#FF0000"/>
    </conditionalStyle>
</style>

我有更多的单元格(col2,col3,col4 ......),我需要应用这种红色文本样式。是否有可能使它对于当前值等是通用的?col *?

1 个答案:

答案 0 :(得分:1)

不使用Java代码的标准/经典方式

不使用 Java 代码是不可能的。在您的情况下,您需要为每个字段创建新样式,并将 textField 元素的具体样式应用于 conditionExpression 包含具体字段的值

在通常情况下, textField 的表达式可能很复杂, conditionExpression 也是如此。该样式不知道它属于哪个控件。我们不能用抽象字段(参数/变量)的值来操作,引擎需要具体的名称来计算表达式。

使用Java API

是否可以使用 JasperReports Java API 解决任务应用样式。例如:

JRDesignStyle boldStyle = new JRDesignStyle();
boldStyle.setName("Sans_Bold");
boldStyle.setFontName("DejaVu Sans");
boldStyle.setFontSize(12);
boldStyle.setBold(true);
// ...
textField.setStyle(boldStyle);
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{col1}");
textField.setExpression(expression);

使用后门或&#34;是的,我们喜欢破解&#34;

看看 Java 中的美丽类是 Map ,它在 JasperReports 中非常宝贵。它可以帮助我们完成这项任务。

  1. 我们需要 Map 类型的参数来存储字段的值(它将是抽象字段 - &#34; col n &#34; < / em>的)
  2. 我们需要在解析 textField 的表达式时启用应用样式。有用的 net.sf.jasperreports.style.evaluation.time.enabled 将有助于启用此功能。
  3. 我们需要一些 Java 方法将值放入 Map (作为&#34; col n &#34; )返回我们刚才放的值。 Map.put(K key, V value) 不适用于此目的。我使用 Map.put 方法的包装器编写了一个小的Utility类。
  4. 数据

    对于此示例,使用简单的 csv 数据源就足够了。我喜欢这种用于测试和调试的数据源。

    col1,col2,col3,col4,col5
    1,2,3,9,-5
    -2,6,-3,4,1
    2,-2,-2,7,-3
    8,3,4,-5,6
    

    以下示例中此数据源的数据适配器名称为 numbers.csv 。跳过文件的第一行 - 它包含列的名称。

    Java代码

    这是一个非常简单的实用程序类

    public class Storage {
    
        public static Integer add(Map<String, Integer> map, String key, Integer value) {
            map.put(key, value);
            return value;
        }
    }
    

    报告模板

    1. 应添加我们的utitlity类的导入以便使用它。

    2. 为了正确解析条件样式的表达式,我们需要在表达式中使用一些参数或一些变量(您可以检查 JasperReports 的源代码)。我将在 conditionExpression

    3. 中添加一些伪变量用于使用
    4. 我们需要将&#34; col n &#34; 的值放入 Map 然后使用条件样式中的此值。在这种情况下,我们不需要知道我们在条件样式中检查的字段的名称。该参数将用于存储 Map

    5. 我们需要在两次运行中放置并绘制&#34; col n &#34; 的值。我们可以使用假的不可见的 textField 将字段的值放到 Map 和另一个 textField 以显示应用条件样式的值。此 textField 的位置和大小相同 - 一个在另一个之上。

    6. 我们的情况将是这样的:

      <style name="ColoredText">
          <conditionalStyle>
              <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) < 0)]]></conditionExpression>
              <style forecolor="blue"/>
          </conditionalStyle>
          <conditionalStyle>
              <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) > 0)]]></conditionExpression>
              <style forecolor="green"/>
          </conditionalStyle>
      </style>
      

      conditionExpression 中没有字段,它有效:)

      jrxml 文件:

      <?xml version="1.0" encoding="UTF-8"?>
      <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Apply style withou name" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
          <property name="com.jaspersoft.studio.data.defaultdataadapter" value="numbers.csv"/>
          <property name="net.sf.jasperreports.style.evaluation.time.enabled" value="true"/>
          <import value="some.package.Storage"/>
          <style name="ColoredText">
              <conditionalStyle>
                  <conditionExpression><![CDATA[$P{STORAGE}.get($P{KEY}) == null && !"null".equalsIgnoreCase($V{FAKE})]]></conditionExpression>
                  <style forecolor="#CC0000"/>
              </conditionalStyle>
              <conditionalStyle>
                  <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) < 0) && !"null".equalsIgnoreCase($V{FAKE})]]></conditionExpression>
                  <style forecolor="#0037FF"/>
              </conditionalStyle>
              <conditionalStyle>
                  <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) > 0) && !"null".equalsIgnoreCase($V{FAKE})]]></conditionExpression>
                  <style forecolor="#00BA00"/>
              </conditionalStyle>
          </style>
          <style name="Fake">
              <conditionalStyle>
                  <conditionExpression><![CDATA[!"null".equalsIgnoreCase($V{FAKE})]]></conditionExpression>
                  <style mode="Opaque" forecolor="#FFFFFF" backcolor="#FFFFFF"/>
              </conditionalStyle>
          </style>
          <parameter name="STORAGE" class="java.util.Map">
              <defaultValueExpression><![CDATA[new java.util.HashMap()]]></defaultValueExpression>
          </parameter>
          <parameter name="KEY" class="java.lang.String">
              <defaultValueExpression><![CDATA["key"]]></defaultValueExpression>
          </parameter>
          <field name="col1" class="java.lang.Integer"/>
          <field name="col2" class="java.lang.Integer"/>
          <field name="col3" class="java.lang.Integer"/>
          <field name="col4" class="java.lang.Integer"/>
          <field name="col5" class="java.lang.Integer"/>
          <variable name="FAKE" class="java.lang.String">
              <variableExpression><![CDATA["FAKE"]]></variableExpression>
          </variable>
          <detail>
              <band height="20">
                  <textField evaluationTime="Auto">
                      <reportElement style="Fake" x="0" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[some.package.Storage.add($P{STORAGE}, $P{KEY}, $F{col1})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="ColoredText" x="0" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[$P{STORAGE}.get($P{KEY})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="Fake" x="100" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[some.package.Storage.add($P{STORAGE}, $P{KEY}, $F{col2})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="ColoredText" x="100" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[$P{STORAGE}.get($P{KEY})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="Fake" x="200" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[some.package.Storage.add($P{STORAGE}, $P{KEY}, $F{col3})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="ColoredText" x="200" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[$P{STORAGE}.get($P{KEY})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="Fake" x="300" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[some.package.Storage.add($P{STORAGE}, $P{KEY}, $F{col4})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="ColoredText" x="300" y="0" width="100" height="20"/>
                      <textFieldExpression><![CDATA[$P{STORAGE}.get($P{KEY})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="Fake" x="400" y="0" width="140" height="20"/>
                      <textFieldExpression><![CDATA[some.package.Storage.add($P{STORAGE}, $P{KEY}, $F{col5})]]></textFieldExpression>
                  </textField>
                  <textField evaluationTime="Auto">
                      <reportElement style="ColoredText" x="400" y="0" width="140" height="20"/>
                      <textFieldExpression><![CDATA[$P{STORAGE}.get($P{KEY})]]></textFieldExpression>
                  </textField>
              </band>
          </detail>
      </jasperReport>
      

      绿色用于正数,蓝色用于负数。红色用于表示算法的问题。

      输出结果

      JRPdfExporter 的帮助下生成的 pdf

      The generated pdf