1

我正在研究 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 格式。

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)

那么如何获取所有字段的值,字段 1、字段 2 和字段 3。我知道的一种方法是我可以一张一张地发送地图。喜欢

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

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

4

1 回答 1

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>
于 2013-06-26T17:50:10.680 回答