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

我的 Controller 代码在这里,这有助于将jasper报告生成为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个子报告。我不知道该怎么做。

我还有一个问题。
我有一个 Realm 类(class)。该类(class)中有一些 Realm 。
class Demo{
String field1
String field2
String field3
}

我正在ireport中发送此类的实例。
Demo demo = Demo.findbyid(1)

那么我如何获得所有字段field1,field2和field3的值。我知道一种方式可以一张一张地发送 map 。喜欢
result.data= [field1:demo.field1,field2:demo.field2]

而且我可以在ireport上获得值(value)来定义同名字段。有什么想法可以从实例中获取值(value)吗?

最佳答案

您可以使用参数在您的报告名称(甚至整个路径)中传递 subreportExpression 应该可以帮助您解决第一个问题。我什至可能已经通过了主报表,这就像使用 dataSourceExpression 一样,是使用Fields而不是Parameters,如果那是您在主报表数据中拥有的东西。

    <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>

关于grails - 如何动态交换报表中的子报表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17317043/

10-15 13:05