Grails 如何在报表中动态交换子报表

Grails 如何在报表中动态交换子报表,grails,groovy,jasper-reports,Grails,Groovy,Jasper Reports,我正在研究grails,并使用jasper report生成pdf和docx。我正在使用ireport制作它。我在主报表中制作了许多子报表。我的要求是动态交换子报表。 这是我的三个子报告 <subreport> <reportElement positionType="Float" x="0" y="91" width="200" height="24"/> <dataSourceExpression><!

我正在研究grails,并使用jasper report生成pdf和docx。我正在使用ireport制作它。我在主报表中制作了许多子报表。我的要求是动态交换子报表。 这是我的三个子报告

<subreport>
            <reportElement positionType="Float" x="0" y="91" width="200" height="24"/>
            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
            <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/showInterest.jasper"]]></subreportExpression>
        </subreport>
        <subreport>
            <reportElement positionType="Float" x="0" y="115" width="200" height="27"/>
            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
            <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/showWorkExperience.jasper"]]></subreportExpression>
        </subreport>
        <subreport>
            <reportElement positionType="Float" x="0" y="142" width="200" height="31"/>
            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
            <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/showEducation.jasper"]]></subreportExpression>
        </subreport>
我正在ireport中发送此类的实例

Demo demo = Demo.findbyid(1)
那么我如何才能得到所有字段的值,field1、field2和field3。有一种方法我知道我可以把地图一张一张地寄过来。像

result.data= [field1:demo.field1,field2:demo.field2]

我可以在ireport上获取值来定义相同名称的字段。您是否知道如何从其实例中获取值。

您可以使用一个参数在子报表中传入报表名称(甚至整个路径)。subreportExpression应该对您的第一个问题有所帮助。我甚至让may main report通过了这是使用字段而不是参数,就像您对数据源表达式所做的那样,如果您在主报表数据中有这样的内容,请参见

    <subreport>
        <reportElement positionType="Float" x="0" y="91" width="200" height="24"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report1}]]></subreportExpression>
    </subreport>
    <subreport>
        <reportElement positionType="Float" x="0" y="115" width="200" height="27"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report2}]]></subreportExpression>
    </subreport>
    <subreport>
        <reportElement positionType="Float" x="0" y="142" width="200" height="31"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report3}]]></subreportExpression>
    </subreport>

您可以使用一个参数在子报表中传入报表名称(甚至整个路径)。子报表表达式应能帮助您回答第一个问题。我甚至让may main report通过了这是使用字段而不是参数,就像您对数据源表达式所做的那样,如果您在主报表数据中有这样的内容,请参见

    <subreport>
        <reportElement positionType="Float" x="0" y="91" width="200" height="24"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report1}]]></subreportExpression>
    </subreport>
    <subreport>
        <reportElement positionType="Float" x="0" y="115" width="200" height="27"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report2}]]></subreportExpression>
    </subreport>
    <subreport>
        <reportElement positionType="Float" x="0" y="142" width="200" height="31"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report3}]]></subreportExpression>
    </subreport>


在一篇帖子中加入两个不同的问题是个坏主意。这两个问题都与ireport有关。所以我不认为这是两个问题的结合,还有很多关于Java的问题。但正如您所看到的,有40多万个用Java标记的问题,而不是一个大问题;)谢谢亚历克斯的建议,下次我会处理好的。但是现在你能回答我的问题吗。因为这个问题,我真的陷入了困境。在一篇帖子中加入两个不同的问题是个坏主意。这两个问题都与ireport有关。所以我不认为这是两个问题的结合,还有很多关于Java的问题。但正如您所看到的,有40多万个用Java标记的问题,而不是一个大问题;)谢谢亚历克斯的建议,下次我会处理好的。但是现在你能回答我的问题吗。因为这个问题,我真的陷入了困境。谢谢你宝贵的回复。但在这里,我用不同的参数设置了每个子报表。在每个子报告中,我发送不同的-2实例列表,并根据该实例设置值。那么,如何才能做到这一点呢?@VivekYadav您可以使用javaapi。例如,您可以尝试使用:或者我确信在API中有更好的方法。我想,如果您将参数设置为通用参数,并在每个子报表中使用相同的名称(
$P{Input1}
这可能会有点混乱)谢谢Mike,我已经找到了一个更好的解决方案,使用dynamic jasper动态生成所有子报表,并动态地从我的控制器传递数据。谢谢您宝贵的回复。但在这里,我用不同的参数设置了每个子报表。在每个子报告中,我发送不同的-2实例列表,并根据该实例设置值。那么,如何才能做到这一点呢?@VivekYadav您可以使用javaapi。例如,您可以尝试使用:或者我确信在API中有更好的方法。我认为,如果您将参数设置为通用参数,并在每个子报表中使用相同的名称(
$P{Input1}
这可能会有点混乱)谢谢Mike,我已经找到了一个更好的解决方案,使用dynamic jasper动态生成所有子报表,并动态地从我的控制器传递数据。
    <subreport>
        <reportElement positionType="Float" x="0" y="91" width="200" height="24"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report1}]]></subreportExpression>
    </subreport>
    <subreport>
        <reportElement positionType="Float" x="0" y="115" width="200" height="27"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report2}]]></subreportExpression>
    </subreport>
    <subreport>
        <reportElement positionType="Float" x="0" y="142" width="200" height="31"/>
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfInstance})]]></dataSourceExpression>
        <subreportExpression class="java.lang.String"><![CDATA["/home/jft/workspace/CvSurgeon/CvSurgeon/report/"+$P{Report3}]]></subreportExpression>
    </subreport>