将自定义数据源添加到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字段:
“学生”实例的集合将传递到报告中。 在此示例中,集合包含单个实例。 在您的示例中,集合可以包含许多实例。 当报表库迭代集合时, firstName
和lastName
不同值将可用。
最初如何填充Student
实例数据的机制超出了本答案的范围。 就报告工具而言,它只是使用预先填充的Student
实例。 如果FillTable
填充了TableCells
,那么这不是报告工具的关注点。
- JasperReports:如何在jsp页面中调用报告
- 可以将java文本字段中的数据发送到jasper报告而无需数据库交互吗?
- 如何将JRBeanCollectionDataSource传递给iReport?
- 在jasperReport文件中出现错误
- java.util.Date:七天前
- 带有spring MVC的JasperReport:在客户端打印报告而不显示它
- Jasper报告在netbeans中运行良好,但在部署为jar应用程序时会出现exception
- 什么版本的JaspeReports支持Java 8?
- OutOfMemoryError:PermGen Space – 在Tomcat上运行Spring的Jasper报告