2011-12-28 3 views
0

Я пытаюсь создать таблицу данных, используя отчеты Jasper. Я использую JRBeanCollectionDataSource для выполнения отчета. Вот подотчет я использую:Создание таблицы данных с использованием отчетов Jasper

<?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="Simple bean example" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <style name="table"> 
     <box> 
      <pen lineWidth="1.0" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="table_TH" mode="Opaque" backcolor="#F0F8FF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="table_CH" mode="Opaque" backcolor="#BFE1FF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="table_TD" mode="Opaque" backcolor="#FFFFFF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <subDataset name="Table Data Set"> 
     <field name="phoneNumber" class="java.lang.String"> 
      <fieldDescription><![CDATA[phoneNumber]]></fieldDescription> 
     </field> 
     <field name="phoneType" class="java.lang.String"> 
      <fieldDescription><![CDATA[phoneType]]></fieldDescription> 
     </field> 
    </subDataset> 
    <background> 
     <band splitType="Stretch"/> 
    </background> 
    <title> 
     <band height="130" splitType="Stretch"> 
      <componentElement> 
       <reportElement key="table" style="table" x="0" y="49" width="180" height="50"/> 
       <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd"> 
        <datasetRun subDataset="Table Data Set"> 
         <datasetParameter name="REPORT_DATA_SOURCE"> 
          <datasetParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></datasetParameterExpression> 
         </datasetParameter> 
        </datasetRun> 
        <jr:column width="90"> 
         <jr:detailCell style="table_TD" height="20"> 
          <textField> 
           <reportElement x="0" y="0" width="90" height="20"/> 
           <textElement/> 
           <textFieldExpression><![CDATA[$F{phoneType}]]></textFieldExpression> 
          </textField> 
         </jr:detailCell> 
        </jr:column> 
        <jr:column width="90"> 
         <jr:detailCell style="table_TD" height="20"> 
          <textField> 
           <reportElement x="0" y="0" width="90" height="20"/> 
           <textElement/> 
           <textFieldExpression><![CDATA[$F{phoneNumber}]]></textFieldExpression> 
          </textField> 
         </jr:detailCell> 
        </jr:column> 
       </jr:table> 
      </componentElement> 
      <staticText> 
       <reportElement x="239" y="12" width="100" height="20"/> 
       <textElement/> 
       <text><![CDATA[Phone Numbers]]></text> 
      </staticText> 
     </band> 
    </title> 
</jasperReport> 

И соответствующий телефон боб

package model; 

public class Phone { 

    private String phoneType; 
    private String phoneNumber; 

    public Phone() { 
    } 

    public Phone(String phoneType, String phoneNumber) { 
     this.phoneType = phoneType; 
     this.phoneNumber = phoneNumber; 
    } 

    public String getPhoneType() { 
     return phoneType; 
    } 
    public void setPhoneType(String phoneType) { 
     this.phoneType = phoneType; 
    } 
    public String getPhoneNumber() { 
     return phoneNumber; 
    } 
    public void setPhoneNumber(String phoneNumber) { 
     this.phoneNumber = phoneNumber; 
    } 

    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     builder.append("\nPhone type: "); 
     builder.append(getPhoneType()); 
     builder.append("\t"); 
     builder.append("Phone number: "); 
     builder.append(getPhoneNumber()); 
     return builder.toString(); 
    } 

} 

Когда я звоню JasperFillManager.fillReport, я получаю следующее исключение:

net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : type 
    at net.sf.jasperreports.engine.fill.JRFillSubreport.prepare(JRFillSubreport.java:750) 
    at net.sf.jasperreports.components.table.fill.FillTableSubreport.prepareSubreport(FillTableSubreport.java:159) 
    at net.sf.jasperreports.components.table.fill.FillTable.prepare(FillTable.java:307) 
    at net.sf.jasperreports.engine.fill.JRFillComponentElement.prepare(JRFillComponentElement.java:129) 
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:328) 
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:393) 
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:352) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:323) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:257) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765) 
    at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:644) 
    at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59) 
    at net.sf.jasperreports.engine.fill.JRThreadSubreportRunner.run(JRThreadSubreportRunner.java:205) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : type 
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123) 
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96) 
    at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100) 
    at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:895) 
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:860) 
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:837) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1434) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836) 
    at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:648) 

Но Я не определил какое-либо поле с именем «type» в Phone bean. Не удалось понять, почему эта ошибка возникает. Кто-то может помочь?

ответ

1

Попробуйте использовать объявление поля, как это:

<field name="phoneType" class="java.lang.String"> 
    <fieldDescription><![CDATA[phone.phoneType]]></fieldDescription> 
</field> 
+0

Он сейчас работает. Но первая строка, передаваемая в коллекции, не появляется в сформированной таблице. – PrasanthNath

+0

Это еще одна проблема. Вы можете прочитать [этот faq] (http://jasperforge.org/uploads/publish/jasperreportswebsite/trunk/faq.html#FAQ20) –

+0

Спасибо, Алекс. Попробуй. – PrasanthNath

Смежные вопросы