我正在使用带有Servlet的Jasper Report。 Team Bean看起来像
private int tid;
private String title;
private List<Member> members;
//getter and setter
成员bean看起来像
private int id;
private String name;
//getter and setter
在报告Servlet中,
List<Team> teams = service.getTeams();
Map parameters = new HashMap();
JasperPrint jasperPrint = null;
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(teams));
在新的JRBeanCollectionDataSource(团队)中添加团队时,如何在Jasper报告中显示它?因为它包含List中的List。
我是否需要子报告来解决此问题?
或者我可以在没有子报告的情况下解决这个问题吗?
答案 0 :(得分:4)
有两种方法可以实现这一目标:
您确实可以使用子报表解决此问题。为此,您需要添加子报表并将其数据源表达式设置为new JRBeanCollectionDataSource($F{members})
。然后,您的Member
bean的字段将作为子报表中的字段提供(例如$F{name}
)。
您也可以使用列表组件在没有子报表的情况下解决此问题。这可以从iReport的调色板中获得,或者您可以复制下面的示例。这需要添加到报告的详细信息区域。
list组件有一个数据源表达式,就像一个报告,你应该设置为new JRBeanCollectionDataSource($F{members})
,并且有一个listContents
元素,其行为类似于子报告的详细信息带;对于数据源中的每个成员,其中的元素将重复一次。
列表组件在报表中需要一个子数据集,但这将由iReport自动添加,或者您可以轻松添加一个空的:<subDataset name="dataset1"/>
。
<componentElement>
<reportElement x="0" y="0" width="555" height="20"/>
<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">
<datasetRun subDataset="dataset1">
<dataSourceExpression><![CDATA[new JRBeanCollectionDataSource($F{members})]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="20" width="555">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
有关列表组件的更多信息,请访问:http://jasperreports.sourceforge.net/sample.reference/list/index.html