如何使用条件/动态前景色创建属性?

时间:2017-07-03 12:59:39

标签: jasper-reports

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

目标:仅当参数“evenRow”为 1 <时,才为“Forecolor”应用“propertyExpression” / 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)

问题:我如何为动态“Forecolor”创建一个propertyExpression,该参数仅在我的参数“evenRow”设置为 1

enter image description here

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

2 个答案:

答案 0 :(得分:4)

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

带参数的单一报告

以下是 propertyExpression 使用参数的小模板:

buttonName = Button(command=lambda: exFunc(int(1Entry.get()), int(2Entry.get())))

JSS 生成的输出结果如下所示:

Preview at JSS

我使用&#34;#000000&#34; 黑色)作为默认颜色。

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

的值

包含子报告和主报告的示例。

我在第一个例子中使用了 propertyExpression 参数的子报表。此报告正在使用&#34; external&#34;参数,但没有区别 - 它只是一个参数

子报告&lt; 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="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>

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

设计非常简单:

Design at JSS

主报告正在使用此子报告

主报告的 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 用于显示行号。

设计看起来像:

The master report at JSS

JSS的输出结果:

Preview at JSS

答案 1 :(得分:1)

我会使用html markupstyled 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>

<强>结果

output

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