【问题标题】:Pass an expression to be evaluated from Java to JasperReports将要评估的表达式从 Java 传递给 JasperReports
【发布时间】:2014-01-09 20:40:54
【问题描述】:

我创建了一个包含三个参数的报告:

  • name(默认值为“World”的字符串)
  • money(默认值为 100 的 Double)
  • 格式化程序(默认值 new DecimalFormat("#,##0.00"))

我从数据库中检索两条记录:

  • "\"你好\" + $P{姓名}"
  • "\"我有\" + $P{formatter}.format($P{money}) + \"美元\""

我将这两条记录传递给 JasperReport 并希望显示

你好世界
我有 100.00 美元

但是,表达式没有被计算,输出变成这样:

“你好” + $P{姓名}
"我有 " + $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);

报告来源

<?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>

【问题讨论】:

  • 你想通过java代码或者ireport计算?
  • 我想在 iReport 中计算。
  • 我发现在 iReport 中没有解决方案。你对用 Java 代码评估它有什么想法吗?

标签: java jasper-reports


【解决方案1】:

你正在尝试做的事情看起来有点像国际化,你的消息包含占位符,jasper 报告用表达式填充它们。

在您的情况下,文本字段可以更改为:

 <textFieldExpression class="java.lang.String"><![CDATA[msg("Hello {0}", $P{name})]]></textFieldExpression> 

jasper 报告会将{0} 替换为name 参数的值。

请注意,消息模式本身可以是一个变量,并且msg() 函数可以有未使用的占位符。在您的示例中,{0} 将绑定到 $P{name}{1}$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

【讨论】:

  • 我的情况是,内容来自数据库。它们将填写在详细信息带中,每个记录可能有不同的参数。需要在报告生成期间评估参数。
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多