Java 使用JasperReports API创建子报表

Java 使用JasperReports API创建子报表,java,jasper-reports,Java,Jasper Reports,我能够使用JasperReports API创建主报告。但是,我们仍然坚持使用JasperReports API设计子报表,并将其添加到主报表设计中 主报告JRXML <band height="250" splitType="Stretch"> <subreport> <reportElement isPrintRepeatedValues="false" x="0" y="0" width="550" height="23

我能够使用JasperReports API创建主报告。但是,我们仍然坚持使用JasperReports API设计子报表,并将其添加到主报表设计中

主报告JRXML

    <band height="250" splitType="Stretch">
        <subreport>
        <reportElement isPrintRepeatedValues="false" x="0" y="0" width="550" height="233" isRemoveLineWhenBlank="true" backcolor="#000000">
        </reportElement>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{time})]]>   
</dataSourceExpression>
        <subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
    </subreport>
   </band>
<field name="count" class="java.lang.String"/>
<field name="timeStamp" class="java.lang.String"/>
<group name="ProductGroup">
    <groupExpression><![CDATA[$F{count}]]></groupExpression>
    <groupHeader>
        <band height="250">
            <timeSeriesChart>
                <chart evaluationTime="Report">
                    <reportElement x="0" y="25" width="550" height="175"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <timeSeriesDataset timePeriod="Minute">
                    <dataset incrementType="None"/>
                    <timeSeries>
                        <seriesExpression><![CDATA["Count"]]></seriesExpression>
                        <timePeriodExpression><![CDATA[new Date(Long.valueOf($F{timeStamp})*1000)]]></timePeriodExpression>
                        <valueExpression><![CDATA[Integer.valueOf($F{count})]]></valueExpression>
                    </timeSeries>
                </timeSeriesDataset>
                <timeSeriesPlot isShowLines="true" isShowShapes="false">
                    <plot/>
                    <timeAxisFormat>
                        <axisFormat>
                            <labelFont/>
                            <tickLabelFont/>
                        </axisFormat>
                    </timeAxisFormat>
                    <valueAxisFormat>
                        <axisFormat>
                            <labelFont/>
                            <tickLabelFont/>
                        </axisFormat>
                    </valueAxisFormat>
                </timeSeriesPlot>
            </timeSeriesChart> 
        </band>
    </groupHeader>
</group>

子报表JRXML

    <band height="250" splitType="Stretch">
        <subreport>
        <reportElement isPrintRepeatedValues="false" x="0" y="0" width="550" height="233" isRemoveLineWhenBlank="true" backcolor="#000000">
        </reportElement>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{time})]]>   
</dataSourceExpression>
        <subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
    </subreport>
   </band>
<field name="count" class="java.lang.String"/>
<field name="timeStamp" class="java.lang.String"/>
<group name="ProductGroup">
    <groupExpression><![CDATA[$F{count}]]></groupExpression>
    <groupHeader>
        <band height="250">
            <timeSeriesChart>
                <chart evaluationTime="Report">
                    <reportElement x="0" y="25" width="550" height="175"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <timeSeriesDataset timePeriod="Minute">
                    <dataset incrementType="None"/>
                    <timeSeries>
                        <seriesExpression><![CDATA["Count"]]></seriesExpression>
                        <timePeriodExpression><![CDATA[new Date(Long.valueOf($F{timeStamp})*1000)]]></timePeriodExpression>
                        <valueExpression><![CDATA[Integer.valueOf($F{count})]]></valueExpression>
                    </timeSeries>
                </timeSeriesDataset>
                <timeSeriesPlot isShowLines="true" isShowShapes="false">
                    <plot/>
                    <timeAxisFormat>
                        <axisFormat>
                            <labelFont/>
                            <tickLabelFont/>
                        </axisFormat>
                    </timeAxisFormat>
                    <valueAxisFormat>
                        <axisFormat>
                            <labelFont/>
                            <tickLabelFont/>
                        </axisFormat>
                    </valueAxisFormat>
                </timeSeriesPlot>
            </timeSeriesChart> 
        </band>
    </groupHeader>
</group>

这些独立的XML将被编译并生成报告

但是,我想使用Jasper Report API创建这些。 我刚刚开始。但没有任何可用的例子

JRDesignSubreport jSubreport = new JRDesignSubreport(jasperDesign); 
jSubreport.setUsingCache(false); 
jSubreport.setRemoveLineWhenBlank(true);

JRDesignExpression subReportDataSourceExpr = new JRDesignExpression();
subReportDataSourceExpr.addResourceChunk("");
//How to set List Data Source?
JRDesignSubreportParameter subReportDataSource = new JRDesignSubreportParameter();
subReportDataSource.setExpression(subReportDataSourceExpr);
jSubreport.setDataSourceExpression(subReportDataSourceExpr);

//How to Add <subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
JRDesignSubreport jSubreport=新的JRDesignSubreport(jasperDesign);
jSubreport.setUsingCache(false);
jSubreport.setRemoveLineWhenBlank(true);
JRDesignExpression subReportDataSourceExpr=新JRDesignExpression();
subReportDataSourceExpr.addResourceChunk(“”);
//如何设置列表数据源?
JRDesignSubreportParameter subReportDataSource=新JRDesignSubreportParameter();
setExpression(subReportDataSourceExpr);
setDataSourceExpression(subReportDataSourceExpr);
//如何添加

这可以通过以下方式完成 将子报表放在一个带内,然后将该带附加到主报表

band = new JRDesignBand();
band.setHeight(250);
band.setSplitType(SplitTypeEnum.STRETCH);

JRDesignSubreport jSubreport = new JRDesignSubreport(jasperDesign); 
jSubreport.setUsingCache(false); 
jSubreport.setRemoveLineWhenBlank(true); 
jSubreport.setPrintRepeatedValues(false);

JRDesignExpression expression = new JRDesignExpression();
expression.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{time})");
jSubreport.setDataSourceExpression(expression);

expression = new JRDesignExpression(); 
expression.setText("\"/path/to/sub.jasper\"");

jSubreport.setExpression(expression);
band.addElement(jSubreport);

令人惊叹的!为我工作。