2014-01-09 46 views
1

我創建了三個參數其中有一個報告:傳遞一個表達式從Java進行評估,以JasperReports的

  • 錢(一個雙人間使用默認值(默認值「世界」的字符串) 100)
  • 格式(默認值新的DecimalFormat( 「#,## 0.00」))

我從數據庫中檢索兩個記錄:

  • 「\」 你好\ 「+ $ P(名稱)」
  • 「\」 我\ 「+ $ P {}格式.format($ P {}錢)+ \」 美元\ 「」

我這兩個記錄傳遞到JasperReport的,並期望顯示

的Hello World
我有100.00美元

然而,表達不評估,輸出變成這樣:

「你好」 + $ P(名稱)
「我有」 + $ P {}格式.format($ P {}錢)+ 「美元」

由於記錄號碼是動態的,我必須將它們放在詳細信息帶中。棘手的部分是每個記錄可能有不同的參數。

有沒有解決方案來使這個想法有效?

Map<String, Object> parameter = new HashMap<String, Object>(); 

List<String[]> records = new ArrayList<String[]>(); 
records.add(new String[] { "\"Hello \" + $P{name}" }); 
records.add(new String[] { "\"I have \" + $P{formatter}.format($P{money}) + \" dollar\"" }); 

String[] columnNames = { "displayText" }; 

JRDataSource dataSource = new ListOfArrayDataSource(records, columnNames); 

JasperPrint jasperPrint = JasperFillManager.fillReport("test.jasper", parameter, dataSource); 

JasperViewer viewer = new JasperViewer(jasperPrint); 
viewer.setDefaultCloseOperation(JasperViewer.EXIT_ON_CLOSE); 
viewer.setVisible(true); 

報告源

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="test" language="groovy" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> 
<property name="ireport.zoom" value="1.4641000000000006"/> 
<property name="ireport.x" value="0"/> 
<property name="ireport.y" value="0"/> 
<parameter name="name" class="java.lang.String" isForPrompting="false"> 
    <defaultValueExpression><![CDATA["World"]]></defaultValueExpression> 
</parameter> 
<parameter name="money" class="java.lang.Double" isForPrompting="false"> 
    <defaultValueExpression><![CDATA[100]]></defaultValueExpression> 
</parameter> 
<parameter name="formatter" class="java.text.DecimalFormat" isForPrompting="false"> 
    <defaultValueExpression><![CDATA[new DecimalFormat("#,##0.00")]]></defaultValueExpression> 
</parameter> 
<field name="displayText" class="java.lang.String"/> 
<detail> 
    <band height="20"> 
     <textField isStretchWithOverflow="true"> 
      <reportElement x="0" y="0" width="555" height="20"/> 
      <textElement> 
       <font fontName="Arial Unicode MS"/> 
      </textElement> 
      <textFieldExpression class="java.lang.String"><![CDATA[$F{displayText}]]></textFieldExpression> 
     </textField> 
    </band> 
</detail> 

+0

您希望通過Java代碼或iREPORT分享到人人來計算? – Sharad

+0

我想在iReport中進行計算。 –

+0

我發現在iReport中沒有解決方案。你有想法用Java代碼評估它嗎? –

回答

0

什麼你正在試圖做的看起來有點像國際化的,在這裏你有一個包含佔位符和碧玉報告填補他們表達的信息。

在你的情況下,文本字段可以改爲:

<textFieldExpression class="java.lang.String"><![CDATA[msg("Hello {0}", $P{name})]]></textFieldExpression> 

和賈斯珀報告將由name參數的值替換{0}

請注意,消息模式本身可能是一個變量,並且可能有未使用的佔位符與msg()函數。在你的榜樣,{0}將被綁定到$P{name}{1}$P{money}

List<String[]> records = new ArrayList<String[]>(); 
records.add(new String[] { "Hello {0}" }); 
records.add(new String[] { "I have {1} dollar" }); 

和:

<textFieldExpression class="java.lang.String"><![CDATA[msg($F{displayText}, $P{name}, $P{money})]]></textFieldExpression> 

更多國際化信息here

+0

我的情況是,內容來自數據庫。他們將填寫詳細信息帶,每個記錄可能有不同的參數。報告生成過程中需要評估參數。 –