如何在iReport中打印另一个列表中包含的字符串列表?

时间:2009-11-20 17:02:58

标签: jasper-reports javabeans ireport

我正在使用java和iReport(来自jasper)创建一个简单的报告程序,它应该用pdf创建一个报告,显示PC的IP地址,位置,此时是否空闲(由另一个人处理)系统),以及它当前所附的项目列表(也在别处管理)。

我正在使用iReport,并创建了一个虚拟集合生成类,如下所示:

public class PCReports {

    public static java.util.Collection PC_collection;
    public static java.util.Collection generateCollection() {

        PC_collection = new ArrayList<PCLineDTO>();
        PCLineDTO line = new PCLineDTO();
        line.setIP("192.168.1.1");
        line.setLab("location");
        line.setActive(true);
        line.addProjectName("project1");
        line.addProjectName("project2");
        line.addProjectName("project3");
        PC_collection.add(line);

        line = new PCLineDTO();
        line.setIp("192.168.1.2");
        line.setLab("location2");
        line.setActive(false);
        line.addProjectName("project1");
        line.addProjectName("project2");
        PC_collection.add(line);

        return PC_collection;
    }
}

在这种情况下,实体类是:

public class PCLineDTO {
    private String ip;
    private String lab;
    private Boolean active;
    private ArrayList<String> projects;
}

在互联网上进行一些搜索之后,我使用子报告找到了a way to do something similar

问题是,我不知道如何打印作为dataSource传递给该子报表的字符串集合。

在我在Internet上找到的示例中,对于主集合中的每个项目,子报表都传递了对象的集合 - 每个属性都有自己的getter方法 - 而不是集合字符串就像这里的情况一样。在这些情况下,他们通过我无法使用的iReport语法访问他们需要使用的值,例如:

$F{project}

由于iReport在其接收的对象中查找包含的getProject方法,但在这种情况下,它是一个简单的String对象(没有getProject方法,因为它)。

4 个答案:

答案 0 :(得分:19)

使用子报表或子数据集。

将子报表传递给集合数据源

JRBeanCollectionDataSource($F{Projects})

然后在新的子报表中创建一个名为“_THIS”的新字段,这意味着传递的集合中的bean与我想要的值相同

有关详细信息,请在此处查看课程的源代码:JRAbstractBeanDataSource

注意:这在JasperReport 3.0.0中可用,我不确定它是否存在于以前的版本中。 希望这有帮助

更新:刚检查过SVN,好像这个功能是在JasperReports 2.0.0中实现的

答案 1 :(得分:3)

有趣。我认为你最好使用List,然后在Project类上定义getName()。然后在子报表中定义变量“name”。它将以这种方式工作,它将允许您轻松添加其他信息,如项目持续时间,团队领导等。

答案 2 :(得分:0)

要在不使用_THIS的情况下详细说明:让我们说java bean有一个subBeans列表,这个subBean有一个复杂的格式,我们想以自定义的方式打印每个subBean。我引用一个示例,其中subDataset元素位于报表级别,而componentElement位于详细信息区域中:

<subDataset name="ListOfSubBeans" uuid="66c86e41-c565-4f18-bccf-1a1b2a567585">
    <field name="subBeanField_1" class="java.lang.String">
        <fieldDescription><![CDATA[subBeanField_1]]></fieldDescription>
    </field>
</subDataset>

...

        <componentElement>
            <reportElement x="780" y="0" width="100" height="30" uuid="f73864b9-46dd-4adb-8dad-a6bd8dfae64e">
                <property name="net.sf.jasperreports.export.headertoolbar.table.name" value=""/>
            </reportElement>
            <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">
                <datasetRun subDataset="ListOfSubBeans" uuid="a8dd1c2b-3ac0-4ffa-b9d0-08e4890e199a">
                    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfSubBeans})]]></dataSourceExpression>
                </datasetRun>
                <jr:listContents height="30" width="100">
                    <textField>
                        <reportElement x="0" y="0" width="100" height="30" uuid="61700c18-6bb9-45da-a235-b76b9f76a2ea"/>
                        <textFieldExpression><![CDATA[$F{subBeanField_1}]]></textFieldExpression>
                    </textField>
                </jr:listContents>
            </jr:list>
        </componentElement>

...

因此,主数据集已声明主bean具有一个列表成员变量:listOfSubBeans。此java.util.List用于提供jr:list的数据源,而jr:list的字段使用名为ListOfSubBeans的subDataset声明(注意区分大小写)。 / p>

答案 3 :(得分:0)

正如Bozho所说,如果proyects是一个复杂对象的数组,你应该将它作为java.util.Collection类型的字段引用,然后将其传递给内部子报告,方法与medopal指示的方式相同。并且不要放置_THIS字段。