我创建了一个包含三个参数的报告,它们是:
- 名称(默认值为“World”的字符串)
- money(默认值为 100 的 Double)
- 格式化程序(默认值 new DecimalFormat("#,##0.00"))
我从数据库检索两条记录:
- "\"你好\"+ $P{name}"
- "\"我有\"+ $P{formatter}.format($P{money}) +\"美元\""
我将这两条记录传递给JasperReport并期望显示
Hello World
I have 100.00 dollar
但是,表达式不会被求值,输出变成这样:
"Hello " + $P{name}
"I have " + $P{formatter}.format($P{money}) + " dollar"
由于记录号是动态的,我必须将它们放在详细信息区域中。棘手的部分是每个记录可能有不同的参数。
有什么解决方案可以让这个想法发挥作用吗?
Map<String, Object> parameter = new HashMap<String, Object>();
List<String[]> records = new ArrayList<String[]>();
records.add(new String[] { "\"Hello \" + $P{name}" });
records.add(new String[] { "\"I have \" + $P{formatter}.format($P{money}) + \" dollar\"" });
String[] columnNames = { "displayText" };
JRDataSource dataSource = new ListOfArrayDataSource(records, columnNames);
JasperPrint jasperPrint = JasperFillManager.fillReport("test.jasper", parameter, dataSource);
JasperViewer viewer = new JasperViewer(jasperPrint);
viewer.setDefaultCloseOperation(JasperViewer.EXIT_ON_CLOSE);
viewer.setVisible(true);
报告来源
<?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="test" language="groovy" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.4641000000000006"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<parameter name="name" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["World"]]></defaultValueExpression>
</parameter>
<parameter name="money" class="java.lang.Double" isForPrompting="false">
<defaultValueExpression><![CDATA[100]]></defaultValueExpression>
</parameter>
<parameter name="formatter" class="java.text.DecimalFormat" isForPrompting="false">
<defaultValueExpression><![CDATA[new DecimalFormat("#,##0.00")]]></defaultValueExpression>
</parameter>
<field name="displayText" class="java.lang.String"/>
<detail>
<band height="20">
<textField isStretchWithOverflow="true">
<reportElement x="0" y="0" width="555" height="20"/>
<textElement>
<font fontName="Arial Unicode MS"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$F{displayText}]]></textFieldExpression>
</textField>
</band>
</detail>
您想要做的事情看起来有点像国际化,其中包含包含占位符的消息,而 jasper 报告则用表达式填充它们。
在您的情况下,文本字段可以更改为:
<textFieldExpression class="java.lang.String"><![CDATA[msg("Hello {0}", $P{name})]]></textFieldExpression>
并且 jasper 报告会将 {0}
替换为 name
参数的值。
请注意,消息模式本身可以是变量,并且 msg()
函数中可以有未使用的占位符。在您的示例中,{0}
将绑定(bind)到 $P{name}
,{1}
将绑定(bind)到 $P{money}
:
List<String[]> records = new ArrayList<String[]>();
records.add(new String[] { "Hello {0}" });
records.add(new String[] { "I have {1} dollar" });
还有:
<textFieldExpression class="java.lang.String"><![CDATA[msg($F{displayText}, $P{name}, $P{money})]]></textFieldExpression>
更多关于 i18n 信息 here
我是一名优秀的程序员,十分优秀!