2009-11-20 107 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(注意區分大小寫)的子數據集聲明的。

相關問題