2013-10-17 22 views
5

Ich habe den folgenden Bericht in JasperReports jrxml, Detail Abschnitt.
Es ist eine Liste, die ich bekomme von Java enthält 2 Objekte, beide werden auf der ersten Seite outputed, so dass jedes Mal Testvariable aufgerufen wird.JasperReports Liste + jeder Datensatz auf der neuen Seite

<detail> 
    <band height="200" splitType="Stretch"> 
     <componentElement> 
      <reportElement key="table" style="table" x="0" y="49" width="500" height="140"/> 

      <jr:list 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="Data Set"> 
        <datasetParameter name="REPORT_DATA_SOURCE"> 
         <datasetParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></datasetParameterExpression> 
        </datasetParameter> 
       </datasetRun> 
       <jr:listContents height="50" > 
        <textField isBlankWhenNull="true"> 
         <reportElement x="0" y="0" width="200" height="20" isRemoveLineWhenBlank="true"/> 
         <textElement textAlignment="Left" verticalAlignment="Middle" > 
          <font size="10" fontName="DejaVu Serif" isBold='true'/> 
         </textElement> 
         <textFieldExpression><![CDATA[$F{test}]]></textFieldExpression> 
        </textField> 
       </jr:listContents> 
      </jr:list> 
     </componentElement> 
    </band> 
</detail> 

So habe ich eine Liste von 2 Objekten, Bohnen. Alles funktioniert, aber diese Testvariable wird auf jeder Seite doppelt angezeigt (beide Objekte werden auf der ersten Seite aufgerufen) und nicht auf einem Objekt pro Seite. Ich möchte nach dem ersten Test eine Pause machen, damit der nächste Test in der Liste auf der nächsten Seite gedruckt wird.

Kann mir jemand in die richtige Richtung zeigen?

Antwort

1

Ich habe die Antwort und ich werde es hier posten, wenn jemand anderes das gleiche Problem hat.

Jasper Bericht ist ziemlich fehlerhaft. Erstens, wenn Sie die Auflistung der Elemente (Objekte) ausdrucken, senden Sie die Sammlung an die Jaspis-Engine, die aus irgendeinem unbekannten Grund das erste Element in der Sammlung nicht erkennt. Sie lösen dies, indem Sie ein Dummy-Objekt zum Index 0 Ihrer Sammlung hinzufügen.

Nach der Suche habe ich herausgefunden, dass Jaspis API die Funktion getPages() hat. Dies gibt die Anzahl der auszudruckenden Seiten in einer Liste zurück. Jeder Index der Liste ist eine Seite. Sie können diese Funktion von diesem jasperPrint aus aufrufen, wenn Sie den Bericht ausfüllen.

JasperReport jasperReport = null; 
JasperPrint jasperPrint = null; 

wo ist der Eingangsstrom des jrxml ist, ist Parameter ein hashmap, und zuletzt ist Ihre Liste Ihrer jRBeancollData Quelle.

beanColDataSource = new JRBeanCollectionDataSource("YOURLIST"); 
jasperReport = JasperCompileManager.compileReport(ist); 
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource); 

Nachdem Sie dieses jasperPrint haben, können Sie diese Funktion aufrufen i geschrieben.

/** 
     * This removes blank page if the page size is bigger then the number of 
     * "pages" in array if for some reason we get last page as empty in pdf - we 
     * also put arraySize - 1 since we ve put one dummy(empty) in the array 
     * collection on index 0 since for some buggy unknown reason jasper always 
     * outputs collections from index 1 forward instead of 0. 
     * 
     * @author Uros 
     * @param pages 
     *   , arraySize 
     */ 
     private void removeBlankPage(List<JRPrintPage> pages, int arraySize) 
     { 
      int numOfPages = pages.size(); 

      if (numOfPages > arraySize - 1) 
      { 
       pages.remove(numOfPages - 1); 
      } 
     } 

Die Funktion in diesem Fall nur die letzte Seite entfernt, können Sie es ändern, so dass es eine andere leere Seite entfernt, wenn es einen gibt, und Arraysize um eins kleiner ist, da Sie in 1 Dummy gesetzt habe. Da Sie jedes Objekt auf jeder Seite drucken, wenn es mehr Seiten als Objekte gibt, ist es offensichtlich, dass es eine leere Seite gibt, also entfernen Sie sie. Sie müssen sicherstellen, dass die Daten nicht auf die nächste Seite übertragen werden, aber ich drucke Seiten, die immer gleich aussehen.

Hoffe, es hilft ..

0

Ich entwerfe meine Berichte in iReport, wodurch ich einen Seitenumbruch per Drag & Drop in das Detailband ziehen kann, aber vielleicht kann Ihnen das helfen. Die sich ergebende XML wie folgt aussieht:

  <break> 
       <reportElement uuid="*uuid here*" x="0" y="28" width="100" height="1"/> 
      </break> 
    </band> 
</detail> 

ich meine am unteren Rand des Detailband eingefügt, so sollten Sie versuchen, Ihre <break> zwischen zwei Objekten eingesetzt wird.

+1

Es wird nicht funktionieren. Ich kann keinen Bruch in der Liste nach textElement einfügen, ich bekomme irgendeine Art von Nullzeigerausnahme, wenn ich Pause vor die Band bringe, druckt sie zuerst die Liste und gibt dann eine neue Seite. –

0

Ja, legen Sie nach dem Drucken Ihres ersten Objekts die Seitenpalette ab. Damit wird das Objekt in verschiedenen Seiten gedruckt.

+0

Es wird nicht funktionieren. Ich kann keinen Bruch in der Liste nach textElement einfügen, ich bekomme irgendeine Art von Nullzeigerausnahme, wenn ich Pause vor die Band bringe, druckt sie zuerst die Liste und gibt dann eine neue Seite. –

0

ein SubReport verwenden. Füttern Sie Ihre Liste als JRBeanCollectionDataSource zu einem Unterbericht. Platzieren Sie diesen Unterbericht zusammen mit einem Seitenumbruch unterhalb des Unterberichts im Detailbereich.

   <break> 
        <reportElement uuid="*uuid here*" x="0" y="28" width="100" height="1"/> 
       </break>