我定义了以下模板:
<?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}
我错过了什么?
答案 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的子类)。你必须:
person
成为Customer
的子类,com.eternity.model.Person
参数更改为具有完全限定包名的类person
(原始答案中没有可见的包)。最后:Customer
字段包含私人修饰符,因此您应该向您的班级添加公开firstName
方法
getFirstName
然后在报告中致电public String getFirstName() {
return this.firstName;
}
。