Anu*_*tel 1 jasper-reports ireport
我在我的应用程序中使用带有Spring MVC的JasperReports进行报告.基本上我首先在iReport 4.1.1中设计报表,然后通过jasper-view.xml将生成的.jasper文件放在我的类路径中
当请求到来时,控制器将所需的参数从Session放到Parameter Map并生成报告.
场景是我的主报告中有大约15个子报告.在所有这些报告中,仅打印符合条件(作为参数传递)的报告(通过Band的"Print When"选项进行控制)
我的问题是:如果我的报告不打印它是否会被执行(即其中的查询)?还是简单地跳过了?
我提出这个问题的理由是报告生成需要相当长的时间(大约2秒,根据我的说法,这对于我的申请来说太长了).
谢谢.
如果您查看"Jasper Reports"的源代码,逻辑表明首先评估'printWhenExpression',然后填写报表元素(如果要打印).
以下是来自JRVerticalFiller.java(版本4.0)的名为' fillNoData ' 的方法,该方法如下:
private void fillNoData() throws JRException
{
if (log.isDebugEnabled() && !noData.isEmpty())
{
log.debug("Fill " + fillerId + ": noData");
}
noData.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);
if (noData.isToPrint())
{
while (noData.getBreakHeight() > pageHeight - bottomMargin - offsetY)
{
addPage(false);
}
noData.evaluate(JRExpression.EVALUATION_DEFAULT);
JRPrintBand printBand = noData.fill(pageHeight - bottomMargin - offsetY);
if (noData.willOverflow() && noData.isSplitPrevented() && isSubreport())
{
resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);
resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);
resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);
scriptlet.callBeforePageInit();
calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);
scriptlet.callAfterPageInit();
addPage(false);
printBand = noData.refill(pageHeight - bottomMargin - offsetY);
}
fillBand(printBand);
offsetY += printBand.getHeight();
while (noData.willOverflow())
{
resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);
resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);
resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);
scriptlet.callBeforePageInit();
calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);
scriptlet.callAfterPageInit();
addPage(false);
printBand = noData.fill(pageHeight - bottomMargin - offsetY);
fillBand(printBand);
offsetY += printBand.getHeight();
}
resolveBandBoundElements(noData, JRExpression.EVALUATION_DEFAULT);
}
}
Run Code Online (Sandbox Code Playgroud)
您需要了解的是,子报表的使用如何影响性能和内存使用情况.看起来您在主报表中嵌入了太多子报表.以下是来自JasperForge链接的内容:
子报告是否存在性能问题?
答案取决于您的系统,数据源和报表设计.关于子报告的几点注意事项:
- 每个子报告执行都可能产生一个新线程(见下文).
- 随着子报表的执行,将在堆内存中创建更多对象.
关于线程的主题.已添加对Java continuation的支持,以替代线程.这是使用Jakarta Commons Javaflow库完成的.JasperReports属性:net.sf.jasperreports.subreport.runner.factory可以与以下两个设置一起使用:
- net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory
- net.sf.jasperreports.engine.fill.JRThreadSubreportRunnerFactory
默认使用net.sf.jasperreports.engine.fill.JRThreadSubreportRunnerFactory,但是如果设置了net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory,那么将使用Javaflow方法填充报告而不是线程.如果选择此选项,则Jakarta Commons Javaflow jar必须包含在应用程序类路径中.这个jar可以在JasperReport报告项目分发包的lib目录中找到.jasperreports-javaflow.properties文件说明了如何在实际实现中设置此属性.在同一报告中处理不同查询的其他替代方法是使用List元素和子数据集.
| 归档时间: |
|
| 查看次数: |
2946 次 |
| 最近记录: |