Jasper reports 子报表中的子报表(IReport JasperReports)

Jasper reports 子报表中的子报表(IReport JasperReports),jasper-reports,ireport,Jasper Reports,Ireport,我有一个要求,需要在子报表中包含子报表。是否有我可以参考的示例代码 提前感谢。在子报表中生成子报表实际上根本不需要任何代码。这可以在没有动态组件(详细信息栏中没有任何内容)的报告中完成。当然,结果报告对任何有趣的事情都没有多大用处 如果您想要一个比这更有趣的报告,您需要为报告和/或子报告提供数据。在这一点上,代码将根据数据的来源而有所不同。如果你能提供更多关于你想做什么的信息,我们可能会提供更多帮助 如果子报表具有动态内容,则需要向其传递对实现JRDataSource的对象的访问权限 例如,我最

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


提前感谢。

在子报表中生成子报表实际上根本不需要任何代码。这可以在没有动态组件(详细信息栏中没有任何内容)的报告中完成。当然,结果报告对任何有趣的事情都没有多大用处

如果您想要一个比这更有趣的报告,您需要为报告和/或子报告提供数据。在这一点上,代码将根据数据的来源而有所不同。如果你能提供更多关于你想做什么的信息,我们可能会提供更多帮助

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

例如,我最近创建了一个一页的报告,其中包含多个“子句”。为了简化我的生活,我将子句存储在映射中,并使用以下代码派生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;
    }
}
私有静态类ListMapDataSource实现JRRewindableDataSource{
私有映射currentMap=null;
私有int currentRow;
私有int numberOfMoveFirsts=0;
私有列表行列表;
ListMapDataSource(列表行列表){
this.rowList=行列表;
首先移动();
}
ListMapDataSource(映射单行){
this.rowList=newarraylist(1);
this.rowList.add(singleRow);
首先移动();
}
public boolean next()引发异常{
如果(currentRow>=rowList.size()-1){
返回false;
}
currentRow++;
currentMap=rowList.get(currentRow);
返回true;
}
公共对象getFieldValue(JRField JRField)引发JRException{
String name=jrField.getName();
Class valueClass=jrField.getValueClass();
if(JasperReport.class.isAssignableFrom(valueClass)){
}
返回currentMap.get(名称);
}
公众优先{
numberOfMoveFirsts++;
如果(numberOfMoveFirsts>10){
System.out.println(“超过10个moveFirst()调用。正在中止”);
系统出口(1);
}
currentRow=-1;
currentMap=null;
}
}

在子报表中生成子报表实际上根本不需要任何代码。这可以在没有动态组件(详细信息栏中没有任何内容)的报告中完成。当然,结果报告对任何有趣的事情都没有多大用处

如果您想要一个比这更有趣的报告,您需要为报告和/或子报告提供数据。在这一点上,代码将根据数据的来源而有所不同。如果你能提供更多关于你想做什么的信息,我们可能会提供更多帮助

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

例如,我最近创建了一个一页的报告,其中包含多个“子句”。为了简化我的生活,我将子句存储在映射中,并使用以下代码派生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;
    }
}
私有静态类ListMapDataSource实现JRRewindableDataSource{
私有映射currentMap=null;
私有int currentRow;
私有int numberOfMoveFirsts=0;
私有列表行列表;
ListMapDataSource(列表行列表){
this.rowList=行列表;
首先移动();
}
ListMapDataSource(映射单行){
this.rowList=newarraylist(1);
this.rowList.add(singleRow);
首先移动();
}
public boolean next()引发异常{
如果(currentRow>=rowList.size()-1){
返回false;
}
currentRow++;
currentMap=rowList.get(currentRow);
返回true;
}
公共对象getFieldValue(JRField JRField)引发JRException{
String name=jrField.getName();
Class valueClass=jrField.getValueClass();
if(JasperReport.class.isAssignableFrom(valueClass)){
}
返回currentMap.get(名称);
}
公众优先{
numberOfMoveFirsts++;
如果(numberOfMoveFirsts>10){
System.out.println(“超过10个moveFirst()调用。正在中止”);
系统出口(1);
}
currentRow=-1;
currentMap=null;
}
}