2011-01-26 179 views
0

使用JasperReports 3.7.6(帶有iReport)生成跨兩頁的報表:報表具有18列數據,第1頁上的列數從1到10以及11到18第二,一個數據記錄顯示在兩個頁面上,並且可以收集大量數據。我試圖搜索論壇,在jasper論壇上提出問題,但沒有得到答案。多頁面碧玉報告

什麼會解決這個問題?

+0

解決!訣竅的方法:1)將所有報告頁面作爲不同的模板。 2)然後在一個模板中構成(元素將重疊)3)爲此報告創建自定義數據源 – pls 2011-01-26 14:21:36

回答

0

1)這是很清楚我認爲,但是..只是使多頁報告的每個頁面分開。

2)使用複製/粘貼XML從一個報告到另一個,在端構成一個所有分離頁面的唯一一個報告將存在,它將包含的所有元素(這是前分離)

3)寫數據源,可能這會套房你:

private final List data; private final Iterator iterator; 

private List<IRecord> buffer; 
private Iterator<IRecord> bufferIterator; 

private IRecord currentValue; 

private int pageCount; 
private int pageRowNum; 

private boolean useBuffer; 
private int position; 
private int counter; 

public MultiPageReportDataSource(List<? extends IRecord> data, int pageRowNum, int pageCount) { 
    this.data = data; 
    this.iterator = this.data.iterator(); 
    this.buffer = new LinkedList<IRecord>(); 
    this.bufferIterator = this.buffer.iterator(); 
    this.pageRowNum = pageRowNum; 
    this.pageCount = pageCount; 
    this.counter = pageCount; 
} 

@Override 
public boolean next() throws JRException { 
    if (position > 0 && position % pageRowNum == 0) { 
     counter--; 
     if (counter == 0) { 
      buffer.clear(); 
      useBuffer = false; 
      counter = pageCount; 
     } else { 
      useBuffer = true; 
      bufferIterator = buffer.iterator(); 
     } 
     position = 0; 
    } 
    if (useBuffer) { 
     if (bufferIterator.hasNext()) { 
      currentValue = bufferIterator.next(); 
     } 
    } else { 
     if (iterator.hasNext()) { 
      currentValue = iterator.next(); 
      buffer.add(currentValue); 
     } else { 
      return false; 
     } 
    } 
    position++; 
    return true; 
} 

@Override 
public Object getFieldValue(JRField jrField) throws JRException { 
    Field field = ReflectUtil.field(CashierReportEntity.class, jrField.getName()); 
    try { 
     return ReflectUtil.accessible(field).get(currentValue); 
    } catch (IllegalAccessException e) { 
     throw new JRException(e); 
    } 
}