JasperReports:子报告渲染

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秒,根据我的说法,这对于我的申请来说太长了).

谢谢.

bch*_*tty 5

如果您查看"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元素和子数据集.