java-如何通过API从JasperReport对象(.jasper编译文件)获取子报表名称?
作者:互联网
有一个包含子报表的主报表文件.它被编译为.jasper,我通过将其加载到JaserReport类中来访问它.
我可以通过低谷获得字段和数据集
report.getMainDataset().getFields();
但是我无法获得子报表,我一直在尝试让它们通过
report.getAllBands();
然后使用for子句
for (int i = 0; i < bands.length; i++) {
JRElement[] element = bands[i].getElements();
}
通过这种方式,我可以获得一些JRBaseSubreport类,这是我所能获得的.我可以访问子报表的元素,但无法获取子报表的名称.
有什么办法吗?
解决方法:
您只能通过将主报表加载到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对象中,并访问名称,字段等.很自然,如果您有一个复杂的表达式,您的代码将需要反映这一点(从数据源中检索参数或数据)
标签:jasper-reports,java 来源: https://codeday.me/bug/20191118/2027519.html