我设计了一个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>
有没有办法通过密钥或其他方式访问列表组件的子代?如果没有,我可以使用哪个组件?
答案 0 :(得分:0)
在jasper中,也许创建一个布尔值更容易,并且根据该布尔值,您可以打印子报表或其他子报表。
boolean visible = myList.size() > 50;
并在属性&#34;打印时表达&#34;把那个布尔。
答案 1 :(得分:0)
我通过删除列表组件解决了这个问题。相反,我只是在细节带中直接使用文本字段。这允许我使用getElementByKey()查找这些字段,并导致更简单的jrxml。