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