子报表中的子报表(IReport-JasperReports)

时间:2009-03-21 13:35:43

标签: jasper-reports ireport

我需要在子报表中包含子报表。是否有我可以参考的示例代码?

提前致谢。

1 个答案:

答案 0 :(得分:3)

您根本不需要任何代码来在子报表中生成子报表。这可以通过没有动态组件的报告来完成(细节带中没有任何内容)。当然,由此产生的报告对于任何有趣的事情都没有多大用处。

如果您想要一个比这更有趣的报告,您需要提供报告和/或子报告的数据。此时,代码将根据数据的来源而有所不同。如果您可以提供有关您尝试做的更多信息,我们可能会提供更多帮助。

如果子报表具有动态内容,则需要向其传入访问实现JRDataSource的对象。

例如,我最近创建了一个单页报告,其中包含多个“子句”。为了让我的生活更简单,我将子句存储在Map中,并使用以下代码派生JRDataSource对象。然后将JRDataSource对象作为主报告的字段传入。

private static class ListMapDataSource implements JRRewindableDataSource {

    private Map currentMap = null;
    private int currentRow;
    private int numberOfMoveFirsts = 0;
    private List<Map<String, ? extends Object>> rowList;

    ListMapDataSource(List<Map<String, ? extends Object>> rowList) {
        this.rowList = rowList;
        moveFirst();
    }

    ListMapDataSource(Map<String, ? extends Object> singleRow) {
        this.rowList = new ArrayList<Map<String, ? extends Object>>(1);
        this.rowList.add(singleRow);
        moveFirst();
    }

    public boolean next() throws JRException {
        if (currentRow >= rowList.size() - 1) {
            return false;
        }

        currentRow++;
        currentMap = rowList.get(currentRow);

        return true;
    }

    public Object getFieldValue(JRField jrField) throws JRException {
        String name = jrField.getName();
        Class valueClass = jrField.getValueClass();

        if (JasperReport.class.isAssignableFrom(valueClass)) {
        }

        return currentMap.get(name);
    }

    public void moveFirst() {
        numberOfMoveFirsts++;

        if (numberOfMoveFirsts > 10) {
            System.out.println("Exceeded 10 moveFirst() calls.  Aborting.");
            System.exit(1);
        }

        currentRow = - 1;
        currentMap = null;
    }
}