【问题标题】:Multi page jasper report多页碧玉报告
【发布时间】:2012-04-27 22:47:05
【问题描述】:

使用 JasperReports 3.7.6(带有 iReport)生成跨越两页的报告:报告有一个包含 18 列数据的表格,第一页从 1 到 10 列,第二页从 11 到 18 列,一条数据记录显示在两个页面上,可能会收集大量数据。我试图搜索论坛,在 jasper 论坛上提问,但没有得到答案。

什么可以解决这个问题?

【问题讨论】:

  • 解决了!诀窍的方法:1)将报告的所有页面作为不同的模板。 2)然后在一个模板中组合(元素将重叠) 3)为此报告制作自定义数据源
  • 请详细回答问题,这可能对其他人有所帮助。
  • 获得您自己问题的答案很棒 - 但请实际将其放入答案中,然后接受它,这样您未回答的问题就不会继续出现在问题列表中。谢谢。

标签: java jasper-reports ireport


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多