子报告中的Jasper Sub Report仅当Java对象列表有一个对象时才将值设置为报告。当列表中有多个时,未设置任何内容

问题描述 投票:0回答:1

有很多关于 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 文件的数据对象设置部分,但由于子报告结构,似乎很难找到正确的方法。请在主报告和子报告中添加您关于设置数据对象的想法。

任何建议或答案都非常感谢

报告输出示例

java jasper-reports subreport
1个回答
0
投票

以下堆栈可能会有所帮助。

如何从 JavaBean 中显示 java.util.List 中的数据

*JavaBean contains the java.util.List.*
 
Userinfo {
    private String username;
    private String password;
    List<Address> listAddress;
}
© www.soinside.com 2019 - 2024. All rights reserved.