2013-10-17 27 views
5

Ho il seguente rapporto in JasperReports jrxml, Sezione di dettaglio.
È una lista che ottengo da Java contenente 2 oggetti, entrambi vengono stampati nella prima pagina, quindi ogni volta che viene chiamata la variabile di test.Elenco Jasper + ciascun record nella nuova pagina

<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> 

Quindi ho una lista di 2 oggetti, fagioli. Tutto funziona ma questa variabile di test viene mostrata due volte su ogni pagina (entrambi gli oggetti vengono richiamati nella prima pagina) invece di un oggetto per pagina. Vorrei mettere una pausa dopo aver stampato il primo test, quindi il prossimo test nell'elenco è stampato nella pagina successiva.

Qualcuno può indicarmi la giusta direzione?

risposta

1

Ho la risposta e la posterò qui se qualcun altro ha lo stesso problema.

Il rapporto di Jasper è piuttosto buggato. Innanzitutto, quando si stampa la raccolta degli elementi (oggetti), si invia la raccolta al motore jasper, che per qualche motivo sconosciuto non riconosce il primo elemento nella raccolta. Risolvi questo aggiungendo un oggetto fittizio sull'indice 0 della tua collezione.

Dopo la ricerca ho scoperto che l'API di jasper ha la funzione getPages(). Questo restituisce il numero di pagine che verranno stampate, in un elenco. Ogni indice di lista è una pagina. È possibile chiamare questa funzione da questo jasperPrint quando si riempie il report.

JasperReport jasperReport = null; 
JasperPrint jasperPrint = null; 

dove ist è il flusso di ingresso del vostro jrxml, parametri è un HashMap, e l'ultimo è la vostra lista della sorgente jRBeancollData.

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

Dopo aver ottenuto questo jasperPrint, è possibile chiamare questa funzione che ho scritto.

/** 
     * 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); 
      } 
     } 

La funzione in questo caso rimuove solo l'ultima pagina, è possibile modificarlo in modo che rimuove qualsiasi altra pagina vuota se ce n'è uno, e arraysize è più piccolo di un dato che si ve messo in 1 manichino. Dato che si stampa ogni oggetto su ogni pagina, se ci sono più pagine e oggetti, è ovvio che c'è una pagina vuota in modo da rimuoverla. È necessario assicurarsi che i dati non si estendano alla pagina successiva del corso, ma stampo pagine che avranno sempre lo stesso aspetto.

Speranza che aiuta ..

0

Ho progettato i report in iReport, che mi consente di trascinare un'interruzione di pagina nella banda di dettagli, ma forse questo può aiutarti. L'XML risultante si presenta come:

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

ho inserito il mio in fondo della banda di dettaglio, così si dovrebbe provare a inserire la tua <break> tra le due oggetti.

+1

Non funzionerà. Non riesco a mettere fine alla lista dopo textElement, ottengo qualche eccezione di puntatore nullo, se metto pausa prima della banda, stampa solo la lista prima e poi dà una nuova pagina. –

0

Sì metti la tavolozza della pagina di interruzione dopo aver stampato il tuo primo oggetto. In questo modo stamperà sia l'oggetto in pagine diverse.

+0

Non funzionerà. Non riesco a mettere fine alla lista dopo textElement, ottengo qualche eccezione di puntatore nullo, se metto pausa prima della banda, stampa solo la lista prima e poi dà una nuova pagina. –

0

Utilizzare un SubReport. Alimenta l'elenco come JRBeanCollectionDataSource in un sottoreport. Collocare il sottoreport nella banda di dettagli insieme all'interruzione di pagina appena sotto il sottoreport.

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