我正在使用java和iReport(来自jasper)创建一个简单的报告程序,应该以pdf格式创建报告,以显示PC的IP地址,位置,当前是否空闲(由其他系统处理),以及当前附加的项目列表(也在其他位置进行管理)。
我为此使用了iReport,并创建了一个虚拟集合生成类,如下所示:
public class PCReports { public static java.util.Collection PC_collection; public static java.util.Collection generateCollection() { PC_collection = new ArrayList<PCLineDTO>(); PCLineDTO line = new PCLineDTO(); line.setIP("192.168.1.1"); line.setLab("location"); line.setActive(true); line.addProjectName("project1"); line.addProjectName("project2"); line.addProjectName("project3"); PC_collection.add(line); line = new PCLineDTO(); line.setIp("192.168.1.2"); line.setLab("location2"); line.setActive(false); line.addProjectName("project1"); line.addProjectName("project2"); PC_collection.add(line); return PC_collection; } }
在这种情况下,实体类为:
public class PCLineDTO { private String ip; private String lab; private Boolean active; private ArrayList<String> projects; }
在Internet上进行了一些搜索之后,我找到了一种使用子报表执行类似 操作的方法。
问题是,我不知道如何打印作为数据源传递到此子报表的字符串的集合。
在我在Internet上找到的示例中,对于主集合中的每个项目,子报表都传递了一个对象集合-每个属性都具有自己的getter方法-而不是像这里那样的字符串集合。在这些情况下,他们通过iReport语法访问了需要使用的值,例如,我无法使用:
$F{project}
由于iReport会寻找它所接收的对象中包含的getProject方法,但是在这种情况下,它是一个简单的String对象(实际上没有getProject方法)。
使用子报表或子数据集。
将子报表传递给集合数据源
JRBeanCollectionDataSource($F{Projects})
然后在新的子报表中完全创建一个名为“ _THIS”的新字段,这意味着传递的集合中的bean与我想要的值相同
有关更多信息,请在此处检查类的源代码:JRAbstractBeanDataSource
注意:JasperReport 3.0.0中提供了此功能,我不确定在以前的版本中是否存在。希望这可以帮助
更新:刚刚检查了SVN,似乎此功能已在JasperReports 2.0.0中实现