我正在使用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;
}
在互联网上进行一些搜索之后,我使用子报告找到了a way to do something similar。
问题是,我不知道如何打印作为dataSource传递给该子报表的字符串集合。
在我在Internet上找到的示例中,对于主集合中的每个项目,子报表都传递了对象的集合 - 每个属性都有自己的getter方法 - 而不是集合字符串就像这里的情况一样。在这些情况下,他们通过我无法使用的iReport语法访问他们需要使用的值,例如:
$F{project}
由于iReport在其接收的对象中查找包含的getProject方法,但在这种情况下,它是一个简单的String对象(没有getProject方法,因为它)。
答案 0 :(得分:19)
使用子报表或子数据集。
将子报表传递给集合数据源
JRBeanCollectionDataSource($F{Projects})
然后在新的子报表中创建一个名为“_THIS”的新字段,这意味着传递的集合中的bean与我想要的值相同
有关详细信息,请在此处查看课程的源代码:JRAbstractBeanDataSource
注意:这在JasperReport 3.0.0中可用,我不确定它是否存在于以前的版本中。 希望这有帮助
更新:刚检查过SVN,好像这个功能是在JasperReports 2.0.0中实现的
答案 1 :(得分:3)
有趣。我认为你最好使用List,然后在Project类上定义getName()。然后在子报表中定义变量“name”。它将以这种方式工作,它将允许您轻松添加其他信息,如项目持续时间,团队领导等。
答案 2 :(得分:0)
正如Bozho所说,如果proyects
是一个复杂对象的数组,你应该将它作为java.util.Collection
类型的字段引用,然后将其传递给内部子报告,方法与medopal指示的方式相同。并且不要放置_THIS字段。
答案 3 :(得分:0)
要在不使用_THIS的情况下详细说明:让我们说java bean有一个subBeans列表,这个subBean有一个复杂的格式,我们想以自定义的方式打印每个subBean。我引用一个示例,其中subDataset元素位于报表级别,而componentElement位于详细信息区域中:
<subDataset name="ListOfSubBeans" uuid="66c86e41-c565-4f18-bccf-1a1b2a567585">
<field name="subBeanField_1" class="java.lang.String">
<fieldDescription><![CDATA[subBeanField_1]]></fieldDescription>
</field>
</subDataset>
...
<componentElement>
<reportElement x="780" y="0" width="100" height="30" uuid="f73864b9-46dd-4adb-8dad-a6bd8dfae64e">
<property name="net.sf.jasperreports.export.headertoolbar.table.name" value=""/>
</reportElement>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="ListOfSubBeans" uuid="a8dd1c2b-3ac0-4ffa-b9d0-08e4890e199a">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfSubBeans})]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="30" width="100">
<textField>
<reportElement x="0" y="0" width="100" height="30" uuid="61700c18-6bb9-45da-a235-b76b9f76a2ea"/>
<textFieldExpression><![CDATA[$F{subBeanField_1}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
...
因此,主数据集已声明主bean具有一个列表成员变量:listOfSubBeans
。此java.util.List用于提供jr:list
的数据源,而jr:list
的字段使用名为ListOfSubBeans
的subDataset声明(注意区分大小写)。 / p>