我有一个目标列表,每个目标中都有另一个 ArrayList。我想使用子报表显示子 ArrayList 中的详细信息。我想为子 ArrayList 中的每个对象创建一个子报表。
我面临的问题是,我似乎无法找到一种方法来为子报表指定 ArrayListas 数据源。尝试创建数据源时,无法选择构建列表的数据集的字段,只能选择主报表的字段。
是否可以在 jasper 报告中执行此操作?我现在坚持这个很长一段时间了。
最佳答案
根据给定的信息,这就是答案。
主 bean(您的目标?),包含其他 bean (SubBean
) 的 List
。
public class Bean {
private String var1;
private List<SubBean> subBeans;
public String getVar1() {
return var1;
}
public void setVar1(String var1) {
this.var1 = var1;
}
public List<SubBean> getSubBeans() {
return subBeans;
}
public void setSubBeans(List<SubBean> subBean) {
this.subBeans = subBean;
}
}
子bean
public class SubBean {
private String var2;
public SubBean(String var2){
this.var2 = var2;
}
public String getVar2() {
return var2;
}
public void setVar2(String var2) {
this.var2 = var2;
}
}
如何将 SubBean 列表传递给子报表。
您需要主报告中的字段 subBeans。
<field name="subBeans" class="java.util.List"/>
我建议你将 .jasper 文件的位置作为参数传递(注意 jasper 报告需要绝对路径)es。在主报告中
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"/>
并在 java 中传递它(例如,工作目录中的子文件夹“jasper”是 subreport.jasper 的位置)
paramMap.put("SUBREPORT_DIR", new File("jasper").getAbsolutePath() + File.separator);
现在只需像这样从主报告中调用您的子报告(需要编译成 .jasper)。
<subreport> <reportElement x="105" y="4" width="400" height="100"/> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subBeans})]]></dataSourceExpression> <subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]></subreportExpression> </subreport>
因此:
我正在创建一个新的 JRDataSource对于传递当前Bean
中SubBean
的List
的子报表
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subBeans})
表示编译后的subreport.jasper的绝对位置
$P{SUBREPORT_DIR} + "subreport.jasper"
所以现在在你的子报表中你可以使用字段:SubBean
的 var2
,只需在 subreport.jrxml 中这样定义它
<field name="var2" class="java.lang.String"/>
关于jasper-reports - 使用列表列表创建子报表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33475934/