【发布时间】:2013-10-01 02:42:26
【问题描述】:
我正在使用 iReport 来制作 PDF 报告。
我的目标是我想在我的 3 个对象元素中使用动态变量(变量名称是 pgnum),并使用 pgnum 在“打印时表达式”对象属性中。
我有三个对象元素,它们是一个文本字段,框架名称的 frameA 和框架名称的 frameB。
我想在 print when 表达式中做这样的事情:
- text field = print when expression : $V{pgnum} % 6 == 1
- frameA = print when expression : $V{pgnum} % 6 == 1
- frameB = 表达式时打印:$V{pgnum} % 6 != 1
如果我的 PDF 共有 14 页,那么我想要的结果是:
- 第 7 页和第 13 页时,将打印文本字段和 frameA。
- 而其他页面(第 7 页和第 13 页除外)仅会打印 frameB。
我在 iReport 中一直尝试,但 pgnum 始终是静态结果,即使在文本字段中,评估时间属性也适用于每一页。并且框架 A 也永远不会被打印,因为我认为 pgnum 始终设置为零 (0) 值,并且永远不会增加。 所以结果是框架 B 总是打印在所有页面中。
你能帮我用 iReport 解决这个问题吗? 或者您能建议甚至帮助我使用其他 jasper 报告,例如动态报告或动态 jasper 来解决这个问题吗?
注意:
- 动态变量的名称是 pgnum。
- 我的 pgnum 的初始值为 0(零)
- 并且有这样的属性 => class="java.lang.Integer" incrementType="Page"calculation="Sum"
感谢阅读。 我正在等待您的回复。
这是我的 jrxml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="deploy_details" language="groovy" pageWidth="502" pageHeight="842" columnWidth="502" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
<style name="table_CH" mode="Opaque" backcolor="#999999">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<variable name="pgnum" class="java.lang.Integer" incrementType="Page" calculation="Count">
<variableExpression><![CDATA[pgnum+1]]></variableExpression>
<initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>
<detail>
<band height="762" splitType="Stretch">
<frame>
<reportElement isPrintRepeatedValues="false" mode="Opaque" x="56" y="66" width="114" height="43" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true" backcolor="#000000">
<printWhenExpression><![CDATA[$V{pgnum} % 6 == 1]]></printWhenExpression>
</reportElement>
<staticText>
<reportElement mode="Transparent" x="15" y="12" width="83" height="18" forecolor="#FFFFFF"/>
<textElement/>
<text><![CDATA[FrameA]]></text>
</staticText>
</frame>
<frame>
<reportElement isPrintRepeatedValues="false" mode="Opaque" x="185" y="66" width="114" height="43" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true" backcolor="#000000">
<printWhenExpression><![CDATA[$V{pgnum} % 6 != 1]]></printWhenExpression>
</reportElement>
<staticText>
<reportElement mode="Transparent" x="15" y="12" width="83" height="18" forecolor="#FFFFFF"/>
<textElement/>
<text><![CDATA[FrameB]]></text>
</staticText>
</frame>
<textField isStretchWithOverflow="true" evaluationTime="Page" isBlankWhenNull="true">
<reportElement isPrintRepeatedValues="false" x="122" y="35" width="100" height="20" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true">
<printWhenExpression><![CDATA[$V{pgnum} % 6 == 1]]></printWhenExpression>
</reportElement>
<box>
<topPen lineWidth="3.25"/>
<leftPen lineWidth="3.25"/>
<bottomPen lineWidth="3.25"/>
<rightPen lineWidth="3.25"/>
</box>
<textElement/>
<textFieldExpression><![CDATA["textField"]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
感谢 Alex K 的回复,但您的回答仍然没有解决我的问题,我已经尝试并按照您的所有命令来解决这个问题,但我仍然得到静态值(不是增量)的 pgnum。
您之前曾向我建议过有关 dataSource 的问题,现在我已将新 jrxml 和 dataSource 示例文件的问题包含在测试包中。但是我有一个新问题,我创建的结果(dummyData)总是在 test.pdf 中打印“空”,您能再帮我一次吗,先生?请问你能解决我的主要目标吗?
谢谢 我在等你的回复
这是链接: dataSource, jrxml
【问题讨论】:
-
你应该发布 jrxml 文件
-
Alex K,你可以查看链接希望你能帮我解决这个问题,谢谢
-
那么测试的数据源呢?
-
我正在使用从列表创建的 JRBeanCollectionDataSource。数据应该是机密的。我在这里想要实现的实际上是创建一个具有不同参数和框架高度的不同标题(框架)的报表,基于页码 mod 6 等于 1 等条件,然后使用的报表标题是标题 a,否则使用标题 b。