0

我是JasperReports的新手,需要帮助。

我们有一个动态获取列标题和数据的场景。这就像一个通用组件,它将生成报告,而与列数以及列标题和数据(它们是动态的)无关。数据(列和数据)使用JasperReports API在Java端动态设置为报告,我们在jrxml文件中只有一个如下模板。

<jr:column width="92">
    <jr:columnHeader style="table 2_CH" height="25" rowSpan="1">
        <staticText>
            <reportElement x="0" y="0" width="92" height="25" backcolor="#99CCFF"/>
            <textElement textAlignment="Center" verticalAlignment="Middle">
                <font fontName="Arial" size="9" isBold="true"/>
            </textElement>
            <text><![CDATA[DYNAMIC_DATA_FIELD]]></text>
        </staticText>
    </jr:columnHeader>
    <jr:detailCell style="table 2_CH" height="25" rowSpan="1">
        <textField isBlankWhenNull="true">
            <reportElement x="0" y="0" width="92" height="25"/>
            <textElement textAlignment="Right" verticalAlignment="Middle">
                <font fontName="Arial" size="8"/>
            </textElement>
            <textFieldExpression><![CDATA[$F{DYNAMIC_DATA_FIELD}]]></textFieldExpression>
        </textField>
    </jr:detailCell>
</jr:column>

此模板将在Java端获取,模板中DYNAMIC_DATA_FIELD的值将替换为列标题文本和数据索引,具体取决于查询结果。

现在我需要根据 UI 中单选按钮的选择隐藏和显示几列。为此,我打算使用printWhenExpression但不确定如何获取列标题文本。我看到了类似$P{JASPER_REPORT}.getColumnHeader()但不知道如何使用它的东西。所以这是我试图使用的条件(下面只是一个模板,我不确定正确的语法)......

if (radioSelection == something) {
    if (columnHeaderText.endsWith('something') {
        return true;
    } else {
        return false;
    }
}

请注意,我将无法在Java代码中将此条件用作其通用组件,并且所有报告都使用此条件。由于在我们的场景中每个报告都有一个jrxml文件,并且这只发生在特定报告中,因此我试图将条件放在jrxml文件中。

4

1 回答 1

0

你可以为每一列(显示与否)制作布尔 [] 数组吗?在这种情况下,您可以将它的数组作为参数传递给 report.jrxml(例如 $P{displayCols})。

在表中将“列打印时”表达式设置为 $P{displayCols[number_of_column]} 其中列数是具体数字(1 或 2 或 3 ...)

但在这种情况下,您必须更改“生成”jrxml?在这种情况下不需要列标题文本

于 2013-08-28T09:33:01.860 回答