2016-09-24 31 views
0

我已經定義了下面的模板:問題與參數傳遞到Jasper報表

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE jasperReport 
     PUBLIC "-//JasperReports//DTD Report Design//EN" 
     "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 

<jasperReport name="HelloJasper_report"> 
    <parameter name="customer" class="com.eternity.model.Customer"/> 
    <detail> 
     <band height="20"> 
      <staticText> 
       <reportElement x="220" y="0" width="200" height="20"/> 
       <text><![CDATA[$P{customer.firstName}]]></text> 
      </staticText> 
     </band> 
    </detail> 
</jasperReport> 

我crateing具有以下報告:

try{ 
    Map<String, Object> parameters = new HashMap<String, Object>(); 
    parameters.put("customer", new Customer("Example name")); 

    System.out.println("Generating PDF..."); 
    JasperReport jasperReport = 
      JasperCompileManager.compileReport("hellojasper.jrxml"); 
    JasperPrint jasperPrint = 
      JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource()); 
    JasperExportManager.exportReportToPdfFile(
      jasperPrint, "HelloJasper.pdf"); 

    System.out.println("HelloJasper.pdf has been generated!"); 
} 
catch (JRException e){ 
    e.printStackTrace(); 
} 

如果客戶是

public class Customer{ 

    private String firstName; 

    public Customer(String firstName){ 
     this.firstName = firstName; 
    } 

} 

但是,生成的PDF只是打印:

$P{customer.firstName} 

我錯過了什麼?

回答

2

首先,在您的報告中,您宣佈了一個staticText區塊,該區塊將完全打印text標記中的值 - 這就是爲什麼您要獲得$P{person.firstName}

爲了評估參數,並打印出來的價值,你應該在你的報表設計使用textFieldtextFieldExpression

<textField isBlankWhenNull = "true"> 
    <reportElement x="220" y="0" width="200" height="20"/> 
    <textElement/> 
    <textFieldExpression class = "java.lang.String"> 
     <![CDATA[$P{person}.firstName]]> 
    </textFieldExpression> 
</textField> 

其次,你宣佈你person參數是com.eternity.model.Person類的一個實例。儘管在代碼中你把Customer作爲person參數(並且它似乎不是Person的子類)。你必須:

  1. 要麼使你的Customercom.eternity.model.Person一個子類,
  2. 或更改報表設計person參數是Customer類的具有完全限定包名(沒有包在你原來的答案可見)。

最後一點:在firstName領域具有private修飾符,所以你應該添加一個公共getFirstName方法您

public String getFirstName() { 
    return this.firstName; 
} 

,然後調用你的報告<![CDATA[$P{person}.getFirstName()]]>

+0

我已更正我在此主題中提出的客戶和人員錯誤 - 但是,它們在代碼中是正確的。我試過了你的textFieldExpression,但是,我得到了以下錯誤: 1.未找到參數:customer.firstName – uksz

+0

@uksz編輯了我的答案,錯誤地在報告中使用大括號。另外請看我的答案中的第三點:您是否添加了公共getter方法? –

+0

是的!它現在的作品!非常感謝!現在我需要生成表:)你可以建議我閱讀任何文件嗎? – uksz