【问题标题】:How do I print a list of strings contained within another list in iReport?如何打印 iReport 中另一个列表中包含的字符串列表?
【发布时间】:2009-11-20 17:02:57
【问题描述】:

我正在使用 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,使用子报告。

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

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

$F{project}

因为 iReport 会在它接收的对象中查找 getProject 方法,但在这种情况下,它是一个简单的 String 对象(实际上没有 getProject 方法)。

【问题讨论】:

  • 您使用的是什么 JasperReport/iReport 版本?
  • @medopal:谢天谢地,最新的(在本文发布时:3.6.1)。

标签: jasper-reports javabeans ireport


【解决方案1】:

使用子报表或子数据集。

向子报表传递一个集合数据源

JRBeanCollectionDataSource($F{Projects})

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

欲了解更多信息,请在此处查看该类的源代码:JRAbstractBeanDataSource

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

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

【讨论】:

  • 谢谢,很高兴它有帮助。顺便说一句,在处理 Jasper 或任何其他开源项目时,我倾向于提取源代码并将其附加到 Eclipse 中的库中。这样更容易在里面挖。祝你好运
  • 我在这里找到了补充细节:community.jaspersoft.com/questions/533552/…
  • “_THIS”是成功的关键!
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。我考虑过这一点,如果事情发展到那个地步,可能会以这种方式实际实施。然而,遗憾的是(当然是我的错),程序的其他部分正在使用这个字符串列表,并且想知道是否有办法绕过搜索和替换它已使用的位置的麻烦和容易出错的任务。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在不使用 _THIS 的情况下对此进行详细说明:假设一个 java bean 有一个 subBean 列表,而这个 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 的子数据集声明(注意区分大小写)。

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2014-02-04
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多