我正在使用iReport制作 PDF 报告。我的目标是我想在我的 3 个对象元素中
使用动态变量(变量的名称是pgnum ),并在“表达式时打印”对象属性中使用pgnum 。
我有三个对象元素,它们是文本字段、框架名称的 frameA 和框架名称的 frameB。
我想在 print when expression 中做这样的事情:
- 文本字段 = 表达式时打印:$V{pgnum} % 6 == 1
- frameA = 表达式时打印:$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