如何通过API从JasperReport对象(.jasper编译文件)获取子报表名称?

时间:2016-07-29 08:55:53

标签: java jasper-reports

包含子报告的主报告文件。它被编译为.jasper,我通过将其加载到JaserReport类来访问它。

我能够通过

获取字段和数据集
report.getMainDataset().getFields();

但是我无法获得子报告,我一直试图让他们通过

report.getAllBands();

然后使用for子句

 for (int i = 0; i < bands.length; i++) {
            JRElement[] element = bands[i].getElements(); 
  }

这样我可以获得一些JRBaseSubreport类,这是我能得到的。我可以访问子报表的元素,但无法获取子报表的名称。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

只有将主报告加载到JasperReport对象中,无法在子报表中获取数据。该对象仅包含主报表及其元素。

相对于子报表的元素是JRBaseSubreport,它引用了与主报表中的子报表标记相关的数据,因此它不包含实际的报表对象。

子报表将由填充加载,具体取决于表达式,您实际上可以根据数据源的值加载不同的子报表,因此jasper报表无法知道子报表加载直到报告填满。

但是你可以访问它将用于加载子报告的表达式,这可能就足够了

有关如何访问表达式的示例(第一个详细信息区域中的子报表)

//I know the subreport is in first detail band so I access this directly 
JRBaseBand detailBand1 = (JRBaseBand) report.getDetailSection().getBands()[0];
List<JRChild> elements = detailBand1.getChildren(); //Get all children
for (JRChild child : elements) {
    if (child instanceof JRBaseSubreport){ //This is a subreport
        JRBaseSubreport subreport = (JRBaseSubreport)child;
        String expression= ""; //Lets find out the expression used
        JRExpressionChunk[] chunks = subreport.getExpression().getChunks();
        for (JRExpressionChunk c : chunks) {
            expression +=c.getText();
        }
        System.out.println(expression); 
        //Here you could do code to load the subreport into a JasperReport object
    }
}

使用此数据,您可以手动将子报表加载到另一个JasperReport对象和访问名称,字段等。当然,如果您有一个复杂的表达式,您的代码将需要反映这一点(反向参数或来自数据源的数据)< / p>