【问题标题】:How to apply conditional style when group changes?组更改时如何应用条件样式?
【发布时间】:2016-02-03 22:26:31
【问题描述】:

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

+-------+-------+
| 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 |
+-------+-------+

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

到目前为止我所尝试的:

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

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

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

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

    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 报告版本兼容,最新版本不需要它

    结果

    【讨论】:

    • 我相信我的变量 $V{print} 可以用在你的 中。因为最终他们使用组增量并导致布尔值。我认为使用矩形的问题在于它们没有像文本字段那样的“评估时间”。评估文本字段时是否评估 中的表达式?
    • @Gustavo 至于你当前的解决方案,calculationType="Nothing"" 我已经编辑了答案,这样你就可以看到为什么这不起作用(invalidates incrementType)
    • @Gustavo 关于评估时间我看不出这与问题有什么关系,因为它不需要(现在应该),我上面的矩形示例会产生相同的结果。 (我对此也有更新答案)
    • 由于我不需要组更改的次数,我尝试使用Boolean 变量。但由于没有ANDORNOT 计算,我将计算设置为nothing,并在表达式中进行“计算”。我不知道nothing 的计算会使incrementType 无效。事实上,我仍然不理解或不同意这种行为。总之感谢。它工作得很好,条件样式(在矩形上)解决方案是一个加号。
    • 1) JasperReports 架构参考:“incrementType:执行计算的变量的增量级别”。 2) JasperReports 终极指南:INCREMENT TYPE:此属性允许您选择增加变量的确切时刻...。 3) iReport 属性注释:增量类型:当变量表达式应该被评估以获得新值时。第一个参考正是你所说的。另外两个是我以前认为的增量类型。
    猜你喜欢
    • 2021-07-13
    • 2022-10-18
    • 2018-05-29
    • 1970-01-01
    • 2014-09-11
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多