如何动态交换报表中的子报表

时间:2013-06-26 10:00:15

标签: grails groovy jasper-reports

我正在研究grails并使用jasper报告生成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>

我的控制器代码在这里,这有助于生成pdf格式的jasper报告。

def testTemplateFileForDownload = {
    def result = [:]
    result.data = []

    result.data << [key1:value1,key2:value2]
    params._format = "PDF"
    params._file = "tamplate9" // set your file name this will call to sample.jrxml
    def report = jasperService.buildReportDefinition(params, request.getLocale(), result)
    generateReport(report)
}

def generateReport = { reportDef ->
        if (!reportDef.fileFormat.inline && !reportDef.parameters._inline) {

            response.setHeader("Content-Disposition", "inline; filename=\"${reportDef.parameters._name ?: reportDef.name}.${reportDef.fileFormat.extension}\"");
            response.setHeader("Content-Type", "${reportDef.fileFormat.mimeTyp}");
            response.contentType = reportDef.fileFormat.mimeTyp
            response.characterEncoding = "UTF-8"
            response.outputStream << reportDef.contentStream.toByteArray()
        } else {
            render(text: reportDef.contentStream, contentType: reportDef.fileFormat.mimeTyp, encoding: reportDef.parameters.encoding ? reportDef.parameters.encoding : 'UTF-8');
        }
}

现在我想在我的pdf中以任何顺序交换这3个子报告。我不知道该怎么办。

我还有一个问题。 我有一个域类。该类中有一些字段。对于演示

class Demo{
String field1
String field2
String field3
}

我在ireport中发送了这个类的实例。

Demo demo = Demo.findbyid(1)

然后我如何获得所有字段的值,field1,field2和field3。我知道的一种方法是我可以逐个发送地图。像

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

我可以在ireport上获得定义同名字段的价值。有什么想法我怎么能从它的实例中获得价值。

1 个答案:

答案 0 :(得分:1)

您可以使用参数传递报告中的名称(甚至整个路径) subreportExpression 应该有助于您解决第一个问题。我甚至可以使用主要报告传递这是使用字段而不是参数,就像您使用 dataSourceExpression 那样,如果这是您在主报告数据中的某些内容。

    <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>
相关问题