首页 > 解决方案 > 如何通过属性文件中定义的名称获取参数值?

问题描述

我正在尝试在 jrxml 文件中动态插入参数的键值:

。特性:

test.1.keyvalue= 测试 test.2.keyvalue= test2

在 jxml 文件中:

$P{str("test.1.keyvalue")}

但这不起作用,我也尝试在.properties文件中创建一个密钥:

test.3.keyvalue = $P{test3}

但是使用 调用str("test.3.keyvalue")会将其转换为字符串。有没有办法做任何相同的事情?

标签: parametersjasper-reportsproperties-file

解决方案


您不能使用任何表达式作为参数名称。甚至这个表达式也无法编译:$P{"paramName"}- 编译器会抛出异常。

内置的$P{REPORT_PARAMETERS_MAP}参数可以帮助解决任务。

工作示例

属性文件

这个基本属性文件就足够了,例如:

text.message = key1

文件名将是custom_messages.properties

报告模板

我定义了 3 个参数来演示如何通过“动态”名称获取参数。

这个基本的jrxmlJaspersoft Studio (JSS)使用“一个空记录”数据源。

<?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="dynamicParameterName" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" resourceBundle="custom_messages">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="a" class="java.lang.String">
        <defaultValueExpression><![CDATA["b"]]></defaultValueExpression>
    </parameter>
    <parameter name="b" class="java.lang.String">
        <defaultValueExpression><![CDATA["valueForB"]]></defaultValueExpression>
    </parameter>
    <parameter name="key1" class="java.lang.String">
        <defaultValueExpression><![CDATA["valueForKey1"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="241" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="360" height="30"/>
                <textElement textAlignment="Right"/>
                <text><![CDATA[$R{text.message}]]></text>
            </staticText>
            <textField>
                <reportElement x="380" y="0" width="160" height="30"/>
                <textFieldExpression><![CDATA[$R{text.message}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="30" width="360" height="30"/>
                <textElement textAlignment="Right"/>
                <text><![CDATA[$P{a}]]></text>
            </staticText>
            <textField>
                <reportElement x="380" y="30" width="160" height="30"/>
                <textFieldExpression><![CDATA[$P{a}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="60" width="360" height="30"/>
                <textElement textAlignment="Right"/>
                <text><![CDATA[$P{b}]]></text>
            </staticText>
            <textField>
                <reportElement x="380" y="60" width="160" height="30"/>
                <textFieldExpression><![CDATA[$P{b}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="90" width="360" height="30"/>
                <textElement textAlignment="Right"/>
                <text><![CDATA[$P{REPORT_PARAMETERS_MAP}.get($P{a})]]></text>
            </staticText>
            <textField>
                <reportElement x="380" y="90" width="160" height="30"/>
                <textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get($P{a})]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="120" width="360" height="30"/>
                <textElement textAlignment="Right"/>
                <text><![CDATA[$P{REPORT_PARAMETERS_MAP}.get($$R{text.message})]]></text>
            </staticText>
            <textField>
                <reportElement x="380" y="120" width="160" height="30"/>
                <textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get($R{text.message})]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

参数a存储我们要显示的参数的名称。下面的表达式正在做所有事情:

<textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get($P{a})]]></textFieldExpression>

它相当于这个表达式:

<textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get("b")]]></textFieldExpression>

或这个:

<textFieldExpression><![CDATA[$P{b}]]></textFieldExpression>

我们可以结合$R{}表达式应用相同的技巧:

<textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get($R{text.message})]]></textFieldExpression>

- 此表达式为我们提供了参数的值,其名称与custom_messages.properties文件中的text.message键一起存储。

输出

JSS 生成的输出将是:

JSS 预览时的输出


更多信息


推荐阅读