有很多关于 jasper 子报告的例子,但没有一个不足以解决我当前的问题。 我想将 Jasper 子报告设置在另一个子报告中。 第一个子报告包含公司列表,第二个子报告用于显示每个公司的分支机构和代理详细信息。
报告主要对象如下。
public class CompanyData{
private String comapnyCode;
private String companyName;
private List<CompanyReportData> records
}
公司列表传递给 Jasper 报告生成。
List<CompanyData> companyList;
Jasper报告生成Java代码:
CompanyReportDataList returnDataList = new CompanyReportDataList();
returnDataList.setCompanyReportData(companyList);
List<CompanyReportDataList > list = new ArrayList<>();
list.add(returnDataList);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
Map<String, Object> parameters = new LinkedHashMap<>();
parameters.put("subPath1", templateSub1);
parameters.put("subPath2", templateSub2);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
公司报表数据列表类
public class CompanyReportDataList {
private List<CompanyData> companyReportData;
}
Jasper 主要报告
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="MainReport" pageWidth="1000" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="6698cc8d-8fb1-4ee3-ae8e-71751cf1d8c5">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="subPath1" class="net.sf.jasperreports.engine.JasperReport"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="companyReportData" class="java.util.List">
<fieldDescription><![CDATA[companyReportData]]></fieldDescription>
</field>
~~~~~~~~~
~~~~~~~~~
<subreport>
<reportElement x="0" y="0" width="940" height="30" uuid="efc7e0c7-fba6-4224-9661-f6549524f16a">
<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
</reportElement>
<dataSourceExpression>
<![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{companyReportData})]]>
</dataSourceExpression>
<subreportExpression><![CDATA[$P{subPath1}]]></subreportExpression>
</subreport>
子报告1
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Sub1Report" pageWidth="940" pageHeight="30" columnWidth="940" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="3122c926-c215-4716-9ae5-2e4d036eea35">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="subPath2" class="net.sf.jasperreports.engine.JasperReport"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="comapnyCode" class="java.lang.String"/>
<field name="comapnyName" class="java.lang.String"/>
<field name="records" class="java.util.List"/>
<background>
<band splitType="Stretch"/>
</background>
<subreport>
<reportElement positionType="Float" x="0" y="0" width="760" height="15" uuid="21e7bc9e-c4b3-4c20-95d6-3dbac43e834d">
<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
<property name="com.jaspersoft.studio.unit.x" value="pixel"/>
</reportElement>
<dataSourceExpression>
<![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{records})]]>
</dataSourceExpression>
<subreportExpression><![CDATA[$P{subPath2}]]></subreportExpression>
</subreport>
子报告2
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Sub2Report" pageWidth="760" pageHeight="15" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="163c4f3a-27ec-4ece-82ca-069c27d06d1b">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="comapnyCode" class="java.lang.String"/>
<field name="branchCode" class="java.lang.String"/>
<field name="branchName" class="java.lang.String"/>
<field name="agentCode" class="java.lang.String"/>
<field name="agentName" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<detail>
<band height="15" splitType="Stretch">
~~~
<subreport>
<reportElement positionType="Float" x="0" y="0" width="760" height="15" uuid="21e7bc9e-c4b3-4c20-95d6-3dbac43e834d">
<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
<property name="com.jaspersoft.studio.unit.x" value="pixel"/>
</reportElement>
<dataSourceExpression>
<![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{records})]]>
</dataSourceExpression>
<subreportExpression><![CDATA[$P{subPath2}]]></subreportExpression>
</subreport>
我认为问题出在 Jasper 文件的数据对象设置部分,但由于子报告结构,似乎很难找到正确的方法。请在主报告和子报告中添加您关于设置数据对象的想法。
任何建议或答案都非常感谢
报告输出示例
以下堆栈可能会有所帮助。
如何从 JavaBean 中显示 java.util.List 中的数据
*JavaBean contains the java.util.List.*
Userinfo {
private String username;
private String password;
List<Address> listAddress;
}