parameters - 如何通过属性文件中定义的名称获取参数值?
问题描述
我正在尝试在 jrxml 文件中动态插入参数的键值:
。特性:
test.1.keyvalue= 测试 test.2.keyvalue= test2
在 jxml 文件中:
$P{str("test.1.keyvalue")}
但这不起作用,我也尝试在.properties
文件中创建一个密钥:
test.3.keyvalue = $P{test3}
但是使用 调用str("test.3.keyvalue")
会将其转换为字符串。有没有办法做任何相同的事情?
解决方案
您不能使用任何表达式作为参数名称。甚至这个表达式也无法编译:$P{"paramName"}
- 编译器会抛出异常。
内置的$P{REPORT_PARAMETERS_MAP}参数可以帮助解决任务。
工作示例
属性文件
这个基本属性文件就足够了,例如:
text.message = key1
文件名将是custom_messages.properties。
报告模板
我定义了 3 个参数来演示如何通过“动态”名称获取参数。
这个基本的jrxml在Jaspersoft 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 生成的输出将是:
更多信息
推荐阅读
- asp.net-mvc - ASP.NET PowerShell 脚本不运行
- node.js - 数组中的 MongoDB 查询元素
- java - Why does Java accept an actual string as an argument to a function that accepts a String object?
- java - JavaFX is dissabled in Eclipse
- tensorflow - TypeError:尝试转发 NN 时,“张量”对象不可调用
- c# - dotnet 上的 Windows 应用程序绝对没有保护吗?
- c# - 开发Web方法测试工具的方法需求
- spring - 我正在使用带有 userdetailed 服务的 Spring Boot 安全性。当我通过邮递员登录时,它给出错误“状态”:404,
- javascript - document.getElementById 没有得到输入
- json - Bash:如何转义字符串以在 JSON 中使用?