将自定义数据源添加到Jaspersoft Studio

我试图通过传递自定义数据源来填充表。 我创建了一个简单的报告,上面有一个表格。 报告它自己从ms sql数据库获取数据。 我编写了一个类似于本例中的类的java类。 但我在桌上没有任何价值。 在该示例中没有scriptlet。 我检查过(String) this.getFieldValue("KN_FormelGG"); 代码行。 它从字段中获取数据并可以在报告中显示。 所以我猜bean数据源没有填充。 我在afterGroupInit调用fill table方法。 如何在jasper中使用java中的数据集合? 我也尝试在数据集和查询对话框中添加java bean,但它也没有帮助我。 我应该将scriptlet添加到子报表/表吗? 我的问题的主要重点是在scriptlet中具有自定义数据源。 我解决了另一个问题 ,但我仍然没有得到答案。 我添加了$P{FieldDataSource}.getData()来检查数据,但它提供了null。

java class 1:

 package testProjektIman.scriptlets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.jasperreports.engine.JRDefaultScriptlet; import net.sf.jasperreports.engine.JRScriptletException; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; public class FillTable extends JRDefaultScriptlet { @Override public void afterGroupInit(final String id) throws JRScriptletException { fillTable(); } public ArrayList splitGGArray(final String kNFormelGG) { ArrayList fieldNames = new ArrayList(); String[] array = (kNFormelGG.split(" ")); for (String sub : array) { fieldNames.add(sub); } return fieldNames; } public Map fillTable() throws JRScriptletException { String kNFormelGG = null; kNFormelGG = (String) this.getFieldValue("KN_FormelGG"); List listTableCells = new ArrayList(); TableCells tableCell; for (String fn : splitGGArray(kNFormelGG)) { tableCell = new TableCells(); tableCell.setFieldName(fn); listTableCells.add(tableCell); } JRBeanCollectionDataSource tableCellJRBean = new JRBeanCollectionDataSource(listTableCells); Map parameters = new HashMap(); parameters.put("FieldDataSource", tableCellJRBean); return parameters; } } 

Java类2

 package testProjektIman.scriptlets; public class TableCells { private String fieldName; private String keyFormel; private String mK; private String notation; private String Item; //getters setters } 

JRXML

                                                               

数据适配器

通过用户界面创建数据适配器文件,例如adapter.xml 。 内容可能类似于:

   YourClass com.yourcompany.jasper.JRDataSourceFactory createCollection false  

数据类

根据上面的数据适配器定义,创建一个具有createCollection方法的类:

 package com.compay.jasper; public class JRDataSourceFactory { /** * @return A collection of data for the report. */ public static Collection createCollection() { return Arrays.asList( new YourClass() ); } } 

设置报告属性

确保报告具有以下属性(将报告链接到自定义数据适配器):

  

设置报告字段

报告字段现在应该能够引用bean属性:

    

重要的是fieldDescription元素包含一个反映bean属性的值(即,您通常调用的Java代码,用于从该bean的实例上的bean中检索值)。

应用

JRDataSourceFactory类是独立的 – 数据适配器使用它来创建bean实例的集合。 static方法( createCollection )在这里工作,并且实际上不能使用inheritance。

如果可能,从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; } } 

数据适配器

数据适配器看起来像:

   Student com.company.jasper.JRDataSourceFactory createCollection false  

数据类

数据类创建bean的实例:

 package com.compay.jasper; import com.company.domain.Student; public class JRDataSourceFactory { public static Collection createCollection() { return Arrays.asList( new Student() ); } } 

报告字段

报告字段反映了bean字段:

       

“学生”实例的集合将传递到报告中。 在此示例中,集合包含单个实例。 在您的示例中,集合可以包含许多实例。 当报表库迭代集合时, firstNamelastName不同值将可用。

最初如何填充Student实例数据的机制超出了本答案的范围。 就报告工具而言,它只是使用预先填充的Student实例。 如果FillTable填充了TableCells ,那么这不是报告工具的关注点。