将参数传递给Jasper报告的问题

时间:2016-09-24 08:22:16

标签: java jasper-reports

我定义了以下模板:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport
        PUBLIC "-//JasperReports//DTD Report Design//EN"
        "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="HelloJasper_report">
    <parameter name="customer" class="com.eternity.model.Customer"/>
    <detail>
        <band height="20">
            <staticText>
                <reportElement x="220" y="0" width="200" height="20"/>
                <text><![CDATA[$P{customer.firstName}]]></text>
            </staticText>
        </band>
    </detail>
</jasperReport>

我正在报告以下内容:

try{
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("customer", new Customer("Example name"));

    System.out.println("Generating PDF...");
    JasperReport jasperReport =
            JasperCompileManager.compileReport("hellojasper.jrxml");
    JasperPrint jasperPrint =
            JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
    JasperExportManager.exportReportToPdfFile(
            jasperPrint, "HelloJasper.pdf");

    System.out.println("HelloJasper.pdf has been generated!");
}
catch (JRException e){
    e.printStackTrace();
}

客户

public class Customer{

    private String firstName;

    public Customer(String firstName){
        this.firstName = firstName;
   }

}

但是,生成的PDF只会打印:

$P{customer.firstName}

我错过了什么?

1 个答案:

答案 0 :(得分:2)

首先,在您的报告中,您宣布了一个staticText数据块,该数据块将准确打印text标记中的值 - 这就是您获取{{}}的原因{{} 1}}。

为了评估参数并打印它的值,您应该在报告设计中使用$P{person.firstName}textField

textFieldExpression

其次,您将<textField isBlankWhenNull = "true"> <reportElement x="220" y="0" width="200" height="20"/> <textElement/> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{person}.firstName]]> </textFieldExpression> </textField> 参数声明为类person的实例。虽然在代码中您将com.eternity.model.Person作为Customer参数(并且它似乎不是Person的子类)。你必须:

  1. 要么使person成为Customer的子类,
  2. 或将您的报告设计com.eternity.model.Person参数更改为具有完全限定包名的类person(原始答案中没有可见的包)。
  3. 最后:Customer字段包含私人修饰符,因此您应该向您的班级添加公开firstName方法

    getFirstName

    然后在报告中致电public String getFirstName() { return this.firstName; }

相关问题