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

Java 如何通过API从JasperReport对象(.jasper编译文件)获取子报表名称?,java,jasper-reports,Java,Jasper Reports,有一个包含子报告的主报告文件。它被编译成.jasper,我通过将它加载到JaserReport类来访问它 我能够从中获取字段和数据集 report.getMainDataset().getFields(); 但是我无法获得子报告,我一直在尝试通过 report.getAllBands(); 然后使用for子句 for (int i = 0; i < bands.length; i++) { JRElement[] element = bands[i].getE

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

我能够从中获取字段和数据集

report.getMainDataset().getFields();
但是我无法获得子报告,我一直在尝试通过

report.getAllBands();
然后使用for子句

 for (int i = 0; i < bands.length; i++) {
            JRElement[] element = bands[i].getElements(); 
  }
for(int i=0;i
这样我可以得到一些
JRBaseSubreport
类,这是我所能得到的。我可以访问子报表的元素,但无法获取子报表的名称


有什么方法可以做到这一点吗?

仅通过将主报表加载到
JasperReport
对象中,您无法获取子报表中的数据。此对象仅包含主报表及其元素

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

子报表将由填充程序加载,具体取决于表达式,您实际上可以根据数据源的值加载不同的子报表,因此jasper report在填充报表之前无法知道要加载的子报表

但是您可以访问它将用于加载子报表的表达式,在您的情况下,这可能就足够了

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

//我知道子报表位于第一个详细信息栏,所以我直接访问它
JRBaseBand detailBand1=(JRBaseBand)报告.getDetailSection().getBands()[0];
List elements=detailBand1.getChildren()//让所有的孩子
for(JRChild子元素){
if(JRBaseSubreport的子实例){//这是一个子报表
JRBaseSubreport subreport=(JRBaseSubreport)子级;
字符串表达式=”“;//让我们找出所使用的表达式
JRExpressionChunk[]chunks=subreport.getExpression().getChunks();
for(JRExpressionChunk c:chunks){
表达式+=c.getText();
}
System.out.println(表达式);
//在这里,您可以编写代码将子报表加载到JasperReport对象中
}
}
有了这些数据,您可以手动将子报表加载到另一个
JasperReport
对象中,并访问名称、字段等。当然,如果您有一个复杂的表达式,您的代码将需要反映这一点(从数据源检索参数或数据)

//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
    }
}