2017-06-20 43 views
0

我使用JasperDesign類創建Jasper對象,並使用jrxml文件中的JRXmlLoader啓動它。 我使用getAllBands()方法提取所有JRBands以獲取所有JRBands,並從每個樂隊中使用JRBand的方法getElements()提取JRElements。如何訪問JasperDesign對象的私有和受保護的JRElements成員?

但是,在得到像staticFieldtextField這樣的每個元素後,我無法從「文本」字段獲取它們的值,該值是私有的或受保護的。

如何訪問這些值?

+0

你應該張貼的代碼 - 重現問題 –

+0

@AlexK這不是問題。 JRElements類的文本值沒有getter。由於Jasper庫是一個開源庫,我可以創建自己的getter來獲取它嗎?如果是,那麼如何? –

+0

'由於Jasper庫是一個開源庫,我可以創建自己的getter來獲取它嗎? - 是的。你可以做你想做的一切。這是Java –

回答

0

您需要的JRElement轉換爲相對JRDesign類能夠訪問該元素的特定屬性:

jrxml

<?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="testJasperDesign" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="597c0716-df6b-42ec-a7c8-863eb1b7174a"> 
    <parameter name="testParam" class="java.lang.String"> 
     <defaultValueExpression><![CDATA["Hello world"]]></defaultValueExpression> 
    </parameter> 
    <variable name="variable1" class="java.lang.String"/> 
    <title> 
     <band height="32" splitType="Stretch"> 
      <textField> 
       <reportElement x="100" y="0" width="100" height="20" uuid="bf5a8f35-3faf-457b-a6fc-b29d97a9c332"/> 
       <textFieldExpression><![CDATA[$P{testParam}]]></textFieldExpression> 
      </textField> 
      <staticText> 
       <reportElement x="0" y="0" width="100" height="20" uuid="59922664-93a3-4f69-a906-5ff418d09cd3"/> 
       <text><![CDATA[Static text]]></text> 
      </staticText> 
     </band> 
    </title> 
</jasperReport> 

的Java

public static void main(String[] args) throws JRException { 

    JasperDesign design = JRXmlLoader.load("jasper/testJasperDesign.jrxml"); 
    JRBand titleBand = design.getTitle(); 
    JRElement[] elements = titleBand.getElements(); 
    for (JRElement element : elements) { 
     if (element instanceof JRDesignTextField){ 
      JRDesignTextField textField = (JRDesignTextField) element; 
      JRExpression expression = textField.getExpression(); 
      System.out.println(expression.getText()); 
     } 
     if (element instanceof JRDesignStaticText){ 
      JRDesignStaticText staticText = (JRDesignStaticText) element; 
      System.out.println(staticText.getText()); 
     } 

    } 
} 

輸出

$ P {} testParam靜態
文本

+0

完美答案。它適合我。非常感謝。 –

+0

Hello Petter, 調用jasperfillmanager的fillReport()方法後,從哪裏獲取文本字段的表達式值(評估後)。我使用java bean來填充它。 –

+0

@SaurabhSonkar對不起,我不能真正理解這個問題,JasperDesign是在你填充之前(因此沒有來自數據源的值),填充後你有JasperPrint(沒有更多的樂隊),但是從這裏你可以得到最終結果文本。 –