Jasper reports JRXML可以在使用数据源之前扩展它吗?

Jasper reports JRXML可以在使用数据源之前扩展它吗?,jasper-reports,Jasper Reports,我使用相同的数据源生成多个报告。其中一份报告需要在底部打印几行空行(“保留”),以便用户可以在需要时手动写入缺失的数据 例如: +---------+-------------+ |项目1 | bla bla| +---------+-------------+ |项目2 | foo| +---------+-------------+ || |您可以修改CustomDataSource并从jrxml中设置它,以便在需要时生成额外记录: 示例 公共类JRExtraptyRecordsDataSo

我使用相同的数据源生成多个报告。其中一份报告需要在底部打印几行空行(“保留”),以便用户可以在需要时手动写入缺失的数据

例如:

+---------+-------------+
|项目1 | bla bla|
+---------+-------------+
|项目2 | foo|
+---------+-------------+

|| |您可以修改CustomDataSource并从jrxml中设置它,以便在需要时生成额外记录:

示例

公共类JRExtraptyRecordsDataSource扩展了JRBeanCollectionDataSource{
私有int nrOfEmptyRecords=0;
私有int currentExtraRecord=0;
公共JRExterEmptyRecordsDataSource(收集beanCollection){
超级(beanCollection);
}       
@凌驾
公共对象getFieldValue(JRField字段)引发JRException{
如果(currentExtraRecord==0){
返回super.getFieldValue(字段);
}
为correctClass=field.getValueClass()初始化;
//如果需要特殊值,请实现逻辑以返回正确的类(反射或开关)
//或者只返回null
返回null;
}
@凌驾
公共布尔下一步(){
布尔next=super.next();
如果(下一个){
返回true;
}
currentExtraRecord++;
返回当前外部记录
我没有自定义数据源我能做什么? 通常不带自定义数据源,您可以使用属性为
isFloatColumnFooter=“true”
(或虚拟组页脚带)的
columnFooter
在详细信息栏末尾显示额外信息。可能我还是会选择此方法,因为它有助于自定义额外行,并避免在正常的详细信息栏中检查
null

如果需要动态指示空记录的数量,请包含一个带有空记录的子报表,并作为数据源传递


您使用的数据源是什么?应用程序向JR库提供的
JRRewindableDataSource
的自定义实现。我已经发布了一个答案,“正常方式”是在需要额外记录时使用组页脚(在详细信息栏后执行某些操作),但您可以包装数据源或在自定义数据源中实现一个特殊函数(您可以通过从jrxml或scriptlet调用它来激活该函数),返回空记录(使用null或您喜欢的任何值)。我无法在应用程序中修改数据源,因为它用于其他报表,正如我在问题中提到的。我只能“延伸"之后,这必须由JRXML启动,所以有些人这样做,有些人不这样做。原则上可以使用组页脚,但它有点难看。如果我的详细信息栏很复杂,我不想在页脚中复制它,那该怎么办?@doublep包装数据源,你不是在修改它,你是在决定何时调用fillManager,如果你你喜欢还是不喜欢空记录。是否允许我们以某种方式更改自定义数据源?我们是否可以添加(从jrxml)调用的实现当我们需要它时?是的,在内部它是一个
ArrayList
。在应用程序创建它之后,它可以被报表修改。关于包装:我不想让应用程序为报表将要做什么而烦恼。例如,应用程序不应该认为“我需要为报表X包装它,因为它需要空行,而不是报表Y”.报表是在运行时创建的,而应用程序是一个web服务器,它可能会在几个月内不作任何更改地运行。也就是说,我不能每次更改报表时都对其进行更改。@doublep,ok,no wrapping我已经编辑了当您需要设置记录数时如何在当前自定义数据源中实现额外记录的答案通过使用defaultExpression定义虚拟变量,从jrxml中删除。
+---------+-------------+
| item 1  | bla bla     |
+---------+-------------+
| item 2  | foo         |
+---------+-------------+
|         |             |   <--- here user can just add forgotten
+---------+-------------+        items with a pen
|         |             |
+---------+-------------+
new net.sf.jasperreports.engine.JREmptyDataSource(P{nrOfEmptyRecords})