我有一个需要在子报表中包含子报表的要求。有我可以参考的示例代码吗?
提前致谢。
您实际上根本不需要任何代码来在子报表中生成子报表。这可以通过没有动态组件(详细信息带中没有)的报告来完成。当然,生成的报告对于任何有趣的事情都没有多大用处。
如果您想要一个比这更有趣的报告,您需要为报告和/或子报告提供数据。届时,代码将根据您的数据来自何处而有所不同。如果您可以提供有关您正在尝试做的事情的更多信息,我们也许可以提供更多帮助。
如果子报表具有动态内容,您将需要向其传递对实现 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;
}
}