将要计算的表达式从Java传递到JasperReports

将要计算的表达式从Java传递到JasperReports,java,jasper-reports,Java,Jasper Reports,我创建了一个报告,其中包含三个参数: 名称(默认值为“World”的字符串) 货币(默认值为100的双精度) 格式化程序(默认值new DecimalFormat(“#,##0.00”)) 我从数据库中检索到两条记录: “\'Hello\'+$P{name}” “\'I have\'+$P{formatter}.format($P{money})+\'dollar” 我将这两条记录传递给JasperReport并希望显示出来 你好,世界 我有100美元 但是,不计算表达式,输出为: “你

我创建了一个报告,其中包含三个参数:

  • 名称(默认值为“World”的字符串)
  • 货币(默认值为100的双精度)
  • 格式化程序(默认值new DecimalFormat(“#,##0.00”))
我从数据库中检索到两条记录:

  • “\'Hello\'+$P{name}”
  • “\'I have\'+$P{formatter}.format($P{money})+\'dollar”
我将这两条记录传递给JasperReport并希望显示出来

你好,世界
我有100美元

但是,不计算表达式,输出为:

“你好”+$p{name}
我有“+$P{formatter}.format($P{money})+”美元”

由于记录编号是动态的,我必须把它们放在细节栏中。棘手的是,每条记录可能有不同的参数

有什么办法可以让这个想法奏效吗

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);
Map参数=newhashmap();
列表记录=新的ArrayList();
add(新字符串[]{“\”Hello\“+$P{name}”);
添加(新字符串[]{I have\'+$P{formatter}.format($P{money})+\'dollar\'});
String[]columnNames={“displayText”};
JRDataSource dataSource=新列表的ArrayDatasource(记录、列名);
JasperPrint-JasperPrint=JasperFillManager.fillReport(“test.jasper”,参数,数据源);
JasperViewer=新的JasperViewer(jasperPrint);
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> 
以及:



关于i18n info的更多信息

您想通过java代码计算还是在ireport中计算?我想在ireport中计算。我发现在ireport中没有解决方案。你有想法用Java代码来评估它吗?我的情况是,内容来自数据库。它们将填入详细信息栏,每个记录可能有不同的参数。在生成报告期间,需要评估这些参数。
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>