Многостраничный отчет о яшме - PullRequest
0 голосов
/ 26 января 2011

Использование JasperReports 3.7.6 (с iReport) для создания отчета, который занимает две страницы: отчет содержит таблицу из 18 столбцов данных, столбцы с 1 по 10 на первой странице и с 11 до 18 на второй, одна запись данных отображается на двух страницах, и может быть собрано много данных. Я пытался искать форумы, задавал вопрос на форуме яшмы и не получил ответа.

Что решит эту проблему?

1 Ответ

0 голосов
/ 28 января 2011

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