例如adapter.xml
,通过用户界面创建数据适配器文件。内容可能类似于:
<?xml version="1.0" encoding="UTF-8" ?>
<beanDataAdapter class="net.sf.jasperreports.data.bean.BeanDataAdapterImpl">
<name>YourClass</name>
<factoryClass>com.yourcompany.jasper.JRDataSourceFactory</factoryClass>
<methodName>createCollection</methodName>
<useFieldDescription>false</useFieldDescription>
</beanDataAdapter>
createCollection
根据上面的数据适配器定义,创建具有方法的类:
package com.compay.jasper;
public class JRDataSourceFactory {
/**
* @return A collection of data for the report.
*/
public static Collection<YourClass> createCollection() {
return Arrays.asList( new YourClass() );
}
}
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="adapter.xml"/>
现在,报告字段应能够引用Bean属性:
<field name="yourObject.property" class="java.lang.String">
<fieldDescription><![CDATA[yourObject.property]]></fieldDescription>
</field>
重要的是,该fieldDescription
元素必须包含一个反映bean属性的值(即,通常会调用该Java代码以从该bean实例上的bean中检索值)。
该JRDataSourceFactory
班是独一无二的- 它使用的数据适配器创建bean实例的集合。该static
方法(createCollection
)在这里做的工作并没有,确实不能,使用继承。
如果可能,请从Bean的属性中借用报告的字段名称。问题中编写的代码很难区分其价值KN_Id
来自何处。
Bean公开了一些属性:
package com.company.domain;
public final class Student extends Entity {
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}
数据适配器如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<beanDataAdapter class="net.sf.jasperreports.data.bean.BeanDataAdapterImpl">
<name>Student</name>
<factoryClass>com.company.jasper.JRDataSourceFactory</factoryClass>
<methodName>createCollection</methodName>
<useFieldDescription>false</useFieldDescription>
</beanDataAdapter>
数据类创建bean的实例:
package com.compay.jasper;
import com.company.domain.Student;
public class JRDataSourceFactory {
public static Collection<Student> createCollection() {
return Arrays.asList( new Student() );
}
}
报告字段反映了bean字段:
<field name="firstName" class="java.lang.String">
<fieldDescription><![CDATA[firstName]]></fieldDescription>
</field>
<field name="lastName" class="java.lang.String">
<fieldDescription><![CDATA[lastName]]></fieldDescription>
</field>
一组“学生”实例被传递到报告中。在此示例中,集合包含一个实例。在您的示例中,集合可能包含许多实例。正如报告库遍历集合,不同的价值观firstName
,并lastName
会提供。
Student
最初如何填充实例数据的机制不在此答案的范围内。就报告工具而言,它仅使用的预填充实例Student
。如果FillTable
填充TableCells
,则报表工具无需担心。