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

Jasper reports 如何水平显示自定义数量的元素?,jasper-reports,Jasper Reports,我希望水平显示元素(在一行中)。我把这个问题想象成一个具有一行和动态列数的表。此表中的每个单元格都包含相同的子报表,但数据源不同 开始时,我尝试将组件列表和子报表结合起来。但事实证明列表组件不支持水平布局。我在某个地方读到了使用交叉表的信息。但是,当我试图将子报表插入测量单元时,iReport会显示一条消息,说明我无法执行此操作。那么我能做些什么呢?基于您的上述评论,我想说水平打印元素列表并不是那么困难。列表组件基本上是一个子报表。因此,您还可以创建一个自定义列表组件,它水平打印元素列表。您只需

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


开始时,我尝试将组件列表和子报表结合起来。但事实证明列表组件不支持水平布局。我在某个地方读到了使用交叉表的信息。但是,当我试图将子报表插入测量单元时,iReport会显示一条消息,说明我无法执行此操作。那么我能做些什么呢?

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

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

<?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>

下面是我创建的示例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>

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

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

我在试图实现这一目标时束手无策,但我想我可能不得不放弃。交叉表也无法拯救,因为它受到两个行组和两个列组的限制。但报告中还有其他字段必须与动态列一起打印。

我不太明白您的要求。您说过您想使用“列表”组件,但它不支持“水平”布局。那么,您正在考虑使用crosttab来水平显示元素列表?这就是你想要的吗?至于在交叉表中使用子报表(根据你的标题),我从来没有尝试过或考虑过这样做……我建议不要这样做。当心在交叉表中使用“拉伸”功能,这会使你的应用程序陷入无限循环问题。嗯。。我希望水平显示元素(在一行中)。我把这个问题想象成一个只有一行和动态列数的表。此表中的每个单元格都包含相同的子报表,但数据源不同。确定。据我所知,您建议在创建报表期间设置足够数量的页面列(例如6)。然后只使用其中的几个(例如前3个)。这是有道理的。