如何水平显示自定义数量的元素?

时间:2012-01-17 12:25:37

标签: jasper-reports

我想水平显示元素(在一个“行”中)。我想象这个问题就像一个有一行和动态列数的表。此表中的每个单元格包含相同的子报表但具有不同的数据源。

一开始我尝试组合组件列表和子报表。但事实证明,列表组件不支持水平布局。我在某处读到了使用交叉表。但是,当我尝试将子报表插入度量单元格时,iReport会显示一条消息,表示我无法执行此操作。那我该怎么办?

2 个答案:

答案 0 :(得分:5)

根据您的上述评论,我会说水平打印元素列表并不困难。 List组件基本上是子报表。因此,您还可以创建自定义List组件,该组件可以水平打印元素列表。您只需要创建一个没有任何边距的新报表,将其设置为“打印订单”为“水平”并设置列数根据您的要求。然后,您可以将此报表作为子报表嵌入到某些主报表和水平打印元素中。

根据您的要求,您可以相应地设置报告和文本字段大小。这是我创建的报告的屏幕截图:

enter image description here

这是我创建的示例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="report name" columnCount="5" printOrder="Horizontal" pageWidth="595" pageHeight="842" columnWidth="119" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band splitType="Stretch"/>
    </title>
    <pageHeader>
        <band splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band splitType="Stretch"/>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{field}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <columnFooter>
        <band splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band splitType="Stretch"/>
    </summary>
</jasperReport>

答案 1 :(得分:0)

@bchetty:对不起,我选择回答而不是评论,因为我没有足够的声誉这样做。您发布的解决方案工作正常,但它使报告布局非常好。我有一个微笑的要求,我将列大小保持为20但是我永远无法预测它在某些查询中不会超过20。同样,如果仅从列的查询中获取三个值,则剩余的列空间保持为空,并且不会为生成的报告提供良好的布局。

我在iReport终极指南中读到,如果List被用作子报告而printOrder是“水平”,我们可以获得动态列的效果。但我想这只是一个“效果”,实际上不是动态列,因为列大小必须固定为大于1的某个值。

我最终想要实现这一目标,但我想我可能不得不放弃。由于受到两个行组和两个列组的限制,交叉表无法进行救援。但该报告还有其他字段,必须与动态列一起打印。 Printing a sub report data horizontally