2009-11-20 101 views
10

我正在使用java和iReport(来自jasper)创建一个简单的报告程序,它应该创建一个pdf格式的报告,显示具有IP地址的个人电脑,他们的位置,目前是否闲置(由另一个系统)以及它目前附属的项目列表(也在别处管理)。如何打印iReport中另一个列表中包含的字符串列表?

我使用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传递给此子报表的字符串集合。

在这些例子中我在网上查到,对于主集合中的每个项目,子报告获得通过对象集合-with自己的getter方法为每个属性 - 而不是字符串的集合作为在这里就是这种情况。在这些情况下,他们访问他们需要经由iReport的语法,这是我无法使用,例如使用的值:

$F{project} 

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

+0

您使用的是JasperReport/iReport版本? – medopal 2009-11-23 15:36:55

+0

@medopal:谢天谢地,最新的(当时这篇文章:3.6.1)。 – 2009-11-23 15:51:26

回答

17

使用子报表或子数据集。

传递报表收集的数据源

JRBeanCollectionDataSource($F{Projects}) 

然后在新的报表创建一个名为“∎本”新字段完全,这意味着通过集合中的bean是一样的价值,我想

欲了解更多信息,请查看这里类的源代码:JRAbstractBeanDataSource

注意:这是提供的JasperReport 3.0.0林不知道,如果它在以前的版本中存在秒。 希望这有助于

更新:刚才检查了SVN,看起来这功能在JasperReports的2.0.0

+1

谢谢,很高兴帮助。简单来说,在处理Jasper或任何其他开源项目时,我倾向于拉取源代码并将其附加到Eclipse中的库中。这种方式更容易挖掘内部。 祝你好运 – medopal 2009-11-23 15:55:22

+0

我在这里找到了互补的细节: http://community.jaspersoft.com/questions/533552/solved-problem-passing-datasource-subreport – 2015-10-07 20:18:01

3

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

+0

谢谢你的回答。我考虑过这一点,并且可能实际上以这种方式实施它,如果事情发生的话。然而,遗憾的是(我承认是我的错),程序的其他部分正在使用这个字符串列表,并且想知道是否有办法规避搜索和替换已使用的地方的麻烦和容易出错的任务。 – 2009-11-23 15:17:33

0

由于Bozho说实现,万一proyects是复杂对象的数组,你应该引用它作为然后将一个类型为java.util.Collection的字段按照medopal指示的方式传递给内部子报告。并且不要放置_THIS字段。

0

为了详细阐述这一点,不使用_THIS:比方说,一个java bean有一个subBeans列表,这个subBean有一个复杂的格式,我们希望以自定义的方式打印每个subBean。我举一个例子,其中的子数据元素是对报告水平和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(注意区分大小写)的子数据集声明的。

相关问题