2009-12-20 30 views
4

我的工作JRXML創建動態報告。我已將參數化列,即該報告的jrxml也可用於生成其他報告。如何通過jrxml創建動態報告?

但是,我沒有設法使字段靈活。也就是說,如果用戶選擇4列,它將工作,但如果選擇1或2或3列,它會給出錯誤,因爲字段名稱未被識別。

請張貼如果急用可以創建或類似的字段名默認表情for循環/ Java腳本可以使用的解決方案。

此外,如何碧玉設計者正是用來實現這一目標?

的JRXML如下:

<?xml version="1.0"?> 
<!DOCTYPE jasperReport 
    PUBLIC "-//JasperReports//DTD Report Design//EN" 
    "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 
<jasperReport name="report1"> 
    <parameter name="reportTitle" class="java.lang.String"/> 
    <parameter name="author" class="java.lang.String"/> 
    <parameter name="startDate" class="java.lang.String"/> 

    <parameter name="C1" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("") 
     </defaultValueExpression> 
    </parameter> 
    <parameter name="C2" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("") 
     </defaultValueExpression> 
    </parameter> 
    <parameter name="C3" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("") 
     </defaultValueExpression> 
    </parameter> 
    <parameter name="C4" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("default parameter value") 
     </defaultValueExpression> 
    </parameter> 

    <field name="COLUMN_1" class="java.lang.Integer"/> 
    <field name="COLUMN_2" class="java.lang.Integer"/> 
    <field name="COLUMN_3" class="java.lang.Integer"/> 
    <field name="COLUMN_4" class="java.lang.Integer"/> 

    <title> 
     <band height="60"> 
      <textField> 
       <reportElement x="0" y="10" width="500" height="40"/> 
       <textElement textAlignment="Center"> 
        <font size="24"/> 
       </textElement> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{reportTitle}]]> 
       </textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement x="0" y="40" width="500" height="20"/> 
       <textElement textAlignment="Center"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA["Run by: " + $P{author} 
         + " on " + $P{startDate}]]> 
       </textFieldExpression> 
      </textField> 
     </band> 
    </title> 

    <columnHeader> 
     <band height="30"> 
      <rectangle> 
       <reportElement x="0" y="0" width="500" height="25"/> 
       <graphicElement/> 
      </rectangle> 

      <textField> 
       <reportElement x="0" y="5" width="170" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C1}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="70" y="5" width="170" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C2}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="150" y="5" width="150" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C3}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="300" y="5" width="150" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C4}]]> 
       </textFieldExpression> 
      </textField> 
     </band> 
    </columnHeader> 

    <detail> 
     <band height="20"> 
      <textField> 
       <reportElement x="5" y="0" width="50" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_1}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="90" y="0" width="150" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_2}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="170" y="0" width="50" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_3}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="320" y="0" width="150" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_4}]]> 
       </textFieldExpression> 
      </textField> 
     </band> 
    </detail> 
</jasperReport> 

回答

1

如果你希望它是動態的,如隱藏/顯示新的領域,我認爲唯一的方法是修改您的JRXML在運行時編譯。

UPDATE:

要在運行時動態的JasperReport你有三種方法:

1.在iReport的
創建JRXML如果您的報告是複雜的,有許多子報表和子數據,最好採用這種方法,因爲iReport可以讓你更快,更容易地設計和維護。
以下這種方法,你將創建在classpath中JRXML文件和存儲,在運行時你會加載該文件,打開它,修改你想要的XML標記時。我建議從包含最大列數的jrxml開始,然後如果用戶選擇較少的列,然後在jrxml中查找這些附加列並刪除它們。

2.在Java中創建整個報告
這種方式是更好,如果您的報告是非常簡單的,就像一個快速表格報告,在這種情況下,你不需要一個JRXML文件,你可以在運行時創建的整個報告從頭開始使用JasperReport庫API。這種方法將使設計報告變得更加困難,因爲在編譯和運行之前,您看不到任何東西。然而更糟的是它的維修噩夢。
你最後的Java源代碼會是這個樣子:"Fixed Column Width Test"

3.使用DynamicJasper的
最後,如果你是開放的新工具,總有DynamicJasper,你可以檢查online demo爲好吧,它非常酷。
我一直在爲DJ展示所有的方法,DJ實際上使用了第二種方法。即時創建報告的Java源代碼。


1:固定列寬測試報告版權歸DynamicJasper的,在這裏的只是作爲一個樣本。

+0

是的,我知道,但如何修改它,這是我的問題嗎?有沒有關於它的想法? – Sundhas 2009-12-20 18:22:39

+1

謝謝medopal 我開放給新的工具,但問題是,我不知道如何使用DJ,因爲我想動態地從我的前端發送屬性到DJ,但我怎麼弄不清楚... 曾經用過DJ? – Sundhas 2009-12-21 00:02:45

+0

它非常易於使用,下載DJ,進入入門指南,從那裏很容易做出您的第一次報告。是的,你肯定能夠從前端屬性動態地創建報告,這正是爲什麼DJ製作:) – medopal 2009-12-21 00:28:11

相關問題