【问题标题】:How to create property with condition / dynamic foreground color?如何使用条件/动态前景色创建属性?
【发布时间】:2017-07-04 14:07:08
【问题描述】:

我在子报表中有一个简单的文本字段。

目标:仅当参数“evenRow”为1“propertyExpression”用于“Forecolor” /em>

以下不起作用,但我试了一下......

<textField>
  <reportElement key="" mode="Transparent" x="108" y="1" width="76" height="13">
    <propertyExpression name="net.sf.jasperreports.style.forecolor">
        <![CDATA[$P{evenRow} == 1 ? $P{colorZebra1_text} : ""]]>
    </propertyExpression>
  </reportElement>
  <textElement><font fontName="SansSerif" size="8"/></textElement>
  <textFieldExpression>"Text"</textFieldExpression>
</textField>

上下文:父报表调用这个!多次包含文本字段的子报表(如附图所示)。每次调用父报表时都会发送参数 "evenRow" 作为 1 或 0...

//snipped from parent report to show that "evenRow" is 1 or 0
($V{REPORT_COUNT}.intValue() % 2 == 0 ?   1 :    0)

问题:如何为动态“前景色”创建一个仅在我的参数 "evenRow" 设置为 1 ?

注意: 我知道我可以使用 conditional styles -> 样式的问题通常是它们永远不是动态的,即我必须为每种颜色创建 1 种样式可以设置...因为颜色可以设置为任何十六进制值,这不是一个选项。

【问题讨论】:

  • 参数被传递给这个“子报表”。因为它是一个子报表,所以它被多次调用。每次“父”报告知道这是一个 ODD 还是 EVEN 子报告调用并因此传递参数 EVENROW (1 或 0) ..我已经更新了我的问题。感谢您的输入

标签: jasper-reports


【解决方案1】:

使用 net.sf.jasperreports.style.forecolor 的概念在实践中与 propertyExpression 配合得很好。

带参数的单一报告

这是带有参数的小模板propertyExpression

<?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="Style forecolor" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="color" class="java.lang.String">
        <defaultValueExpression><![CDATA["#E3106B"]]></defaultValueExpression>
    </parameter>
    <parameter name="isApplyColor" class="java.lang.Boolean">
        <defaultValueExpression><![CDATA[true]]></defaultValueExpression>
    </parameter>
    <parameter name="DEFAULT_COLOR" class="java.lang.String" >
        <defaultValueExpression><![CDATA["#000000"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement x="211" y="39" width="100" height="30" uuid="4af3eb91-2334-40fe-a77a-45378fe93210">
                    <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$P{isApplyColor} ? $P{color} : $P{DEFAULT_COLOR}]]></propertyExpression>
                </reportElement>
                <textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

JSS生成的输出结果如下:

我使用“#000000”黑色)作为默认颜色。

看来您需要检查并修复 $P{evenRow}

的值

带有子报表和主报表的示例。

我在 propertyExpression 处使用带有参数的子报表,就像第一个示例一样。此报告使用“外部”参数,但没有区别 - 它只是一个参数

子报表的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="Subreport" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="color" class="java.lang.String">
        <defaultValueExpression><![CDATA["#E3106B"]]></defaultValueExpression>
    </parameter>
    <parameter name="DEFAULT_COLOR" class="java.lang.String">
        <defaultValueExpression><![CDATA["#000000"]]></defaultValueExpression>
    </parameter>
    <parameter name="evenRow" class="java.lang.Integer"/>
    <title>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="130" y="0" width="100" height="20">
                    <property name="com.jaspersoft.studio.unit.height" value="pixel"/>
                    <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$P{evenRow} == 0 ? $P{color} : $P{DEFAULT_COLOR}]]></propertyExpression>
                </reportElement>
                <textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="20" y="0" width="100" height="20"/>
                <textFieldExpression><![CDATA["evenRow: " + $P{evenRow}]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

第二个 textField 仅用于检查 $P{evenRow} 的值。

设计很简单:

主报表正在使用这个子报表

主报告的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="Master" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="10 empty rows"/>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20"/>
                <textFieldExpression><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
            </textField>
            <subreport>
                <reportElement x="130" y="0" width="200" height="20"/>
                <subreportParameter name="evenRow">
                    <subreportParameterExpression><![CDATA[($V{REPORT_COUNT}  % 2 == 0 ?  1 :  0)]]></subreportParameterExpression>
                </subreportParameter>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>
                <subreportExpression><![CDATA["Subreport.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

textField 用于显示行号。

设计如下:

JSS 的输出结果:

【讨论】:

  • 不错的答案,我看到它们从 4.8 版开始可用(我继续忽略它们)
  • 有效。谢谢你! (我可以发誓我已经试过了,嗯)。结果:i.imgur.com/mTUif9B.png --- 知道我怎样才能拥有一条线的条件样式吗?我试过了——jsfiddle.net/6e0uv09p/2
【解决方案2】:

我会使用htmlmarkupstyled text在表达的基础上实现动态颜色。

"<font color='"  + ($P{evenRow}.equals("1") ? $P{colorZebra1_text} : "#000000") + "'>Hello world</font>"

完整示例

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="ParameterForeground" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="18af9727-d961-4a87-ad3b-c7f64aa36f0d">
    <parameter name="evenRow" class="java.lang.String"/>
    <parameter name="colorZebra1_text" class="java.lang.String"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="330" height="30" uuid="78773d07-454d-4168-ac36-1351e6b278c1"/>
                <textElement markup="html"/>
                <textFieldExpression><![CDATA["<font color='"  + ($P{evenRow}.equals("1") ? $P{colorZebra1_text} : "#000000") + "'>Hello world</font>"]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

结果

参数evenRow 可能会更好作为java.lang.Integer 类,但是由于您使用的是equals,我假设您已将其定义为java.lang.String,如果Integer 表达式将是$P{evenRow}==1

【讨论】:

  • 非常好!这样可行。我想知道是否有办法拥有“条件参数表达式”。结果:i.imgur.com/K0oGXeb.png
  • 彼得。我将如何为报告元素(行)执行此操作?:) ----
  • 刚刚看到:当我将标记设置为 html 时,任何模式设置都会丢失。不能那样做。所以我需要另一种方式!
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多