如何在群组更改时应用条件样式?

时间:2016-02-02 16:08:19

标签: jasper-reports

有很多关于如何对报告的进行斑马纹理的教程。像这样:

+-------+-------+
| Value | Color |
+-------+-------+
| A     | white |
| A     | black |
| B     | white |
| B     | black |
| B     | white |
| C     | black |
| D     | white |
| D     | black |
+-------+-------+

但我想要做的是分组剥离。像这样:

+-------+-------+
| Value | Color |
+-------+-------+
| A     | white |
| A     | white |
| B     | black |
| B     | black |
| B     | black |
| C     | white |
| D     | black |
| D     | black |
+-------+-------+

我使用“Value”列作为组的表达式,我的数据按“Value”排序。 “黑色”是组黑色时要打印的黑色矩形。 “白色”是没有黑色矩形。我想要一个变量,我可以放入黑色矩形的“打印表达式”。

到目前为止我一直在尝试:

  • 创建变量$ V {print}
  • 初始值表达式:false
  • 变量表达式:!$ V {print}
  • 增量类型:组
  • 增量组:值

我预计每次更改组时,$ V {print}的值都会更改为相反的值。我得到的是普通条纹列表(黑色,白色,黑色,白色......)

1 个答案:

答案 0 :(得分:3)

您当前解决方案的问题是:

calculationType="Nothing"
  

Nothing :这是变量执行的默认计算类型。这意味着变量的值会在数据源中的每次迭代时重新计算,并且返回的值是通过简单地评估变量的表达式来获得的。

此类计算会使您的incrementType无效,因此incrementType无效,因为我们没有计算。这就是为什么你现在得到黑色,白色,黑色和白色。

这将达到您想要的效果

变量定义允许每次组更改,总和或计数时,计算示例会增加1)

<variable name="GroupCnt" class="java.lang.Integer" incrementType="Group" incrementGroup="myGroup" calculation="Sum">
    <variableExpression><![CDATA[1]]></variableExpression>
</variable>

conditionExpression 我们可以使用模数运算符变量GroupCnt

<conditionExpression><![CDATA[$V{GroupCnt}%2==0]]></conditionExpression>

完整jrxml的示例(我在此添加了一个矩形作为OP注释)

<?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="group" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="c1d9b4b7-6162-4b17-b871-3cf3b867d1ef">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <style name="myStyle">
        <conditionalStyle>
            <conditionExpression><![CDATA[new Boolean($V{GroupCnt}.intValue()%2==0)]]></conditionExpression>
            <style mode="Opaque" forecolor="#FFFFFF" backcolor="#000000"/>
        </conditionalStyle>
    </style>
    <field name="Value" class="java.lang.String"/>
    <variable name="GroupCnt" class="java.lang.Integer" incrementType="Group" incrementGroup="myGroup" calculation="Sum">
        <variableExpression><![CDATA[1]]></variableExpression>
    </variable>
    <group name="myGroup">
        <groupExpression><![CDATA[$F{Value}]]></groupExpression>
    </group>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement style="myStyle" x="0" y="0" width="150" height="20" uuid="7ca1ac35-6249-4ba6-ac87-031f8d410d2e"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{Value}]]></textFieldExpression>
            </textField>
            <rectangle>
                <reportElement style="myStyle" x="150" y="0" width="150" height="20" uuid="d322e0df-0d39-4370-90e6-58305d449852"/>
            </rectangle>
        </band>
    </detail>
</jasperReport>

new Boolean($V{GroupCnt}.intValue()%2==0)new BooleanintValue()仅用于与最新版本中不需要的旧jasper报告版本兼容

<强>结果

Result