访问JasperReports API(版本5.6.1)中ListComponent内的元素

时间:2014-11-10 15:33:11

标签: java jasper-reports

我设计了一个jrxml报告,它将bean列表作为数据源。根据列表的大小,我想更改报告的外观。根据我的理解,只有通过操作编译的JasperReport对象才能使用JasperReports API。

要更改列witdths,我需要访问List组件内的元素。对于List组件之外的元素,它的工作方式如下:

JasperReport jasperReport =     jasperCompileManager.compileReport(detailReportTemplate.getInputStream());
// access element inside the ColumnHeader
JRElement ch0 = jasperReport.getColumnHeader().getElementByKey("ColumnHeader0");
// access the list
JRBaseComponentElement list = (JRBaseComponentElement) jasperReport.getDetailSection().getBands()[0].getElementByKey("DetailList");

上述工作,但我不知道如何访问列表中的元素。在乐队内部搜索返回" null"对于chlid元素:

JRElement cv0 = jasperReport.getDetailSection().getBands()[0].getElementByKey("ColumnValue0");

我的jrxml snipplet:

<jasperReport>
    <columnHeader>
        <band height="62" splitType="Stretch">
            <textField>
                <reportElement key="ColumnHeader0" x="425" y="41" width="100" height="20">
                    <printWhenExpression><![CDATA[$P{SPF_ITEM_LIST}.size() > 2]]></printWhenExpression>
                </reportElement>
            <textElement>
                <font size="11" isBold="true"/>
            </textElement>
            <textFieldExpression><![CDATA[...]]></textFieldExpression>
        </textField>
        ...
    </band>
</columnHeader>
<detail>
    <band height="20" splitType="Stretch">
        <componentElement>
            <reportElement key="DetailList" x="0" y="0" width="555" height="20" />
            <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                ...
                <jr:listContents height="20" width="555">
                    <textField isStretchWithOverflow="true">
                        <reportElement key="ColumnValue0" style="zebra" positionType="Float" stretchType="RelativeToTallestObject" x="225" y="0" width="100" height="20"/>
                        <textFieldExpression><![CDATA[...]]></textFieldExpression>
                    </textField>
                </jr:listContents>
            </jr:list>
        </componentElement>
    </band>
</detail>

有没有办法通过密钥或其他方式访问列表组件的子代?如果没有,我可以使用哪个组件?

2 个答案:

答案 0 :(得分:0)

在jasper中,也许创建一个布尔值更容易,并且根据该布尔值,您可以打印子报表或其他子报表。

 boolean visible = myList.size() > 50;

并在属性&#34;打印时表达&#34;把那个布尔。

答案 1 :(得分:0)

我通过删除列表组件解决了这个问题。相反,我只是在细节带中直接使用文本字段。这允许我使用getElementByKey()查找这些字段,并导致更简单的jrxml。