【问题标题】:How can I build a table of contents in iReport/JasperReports?如何在 iReport/JasperReports 中构建目录?
【发布时间】:2011-11-13 12:38:12
【问题描述】:

我们使用 iReport 使我们的客户能够为其产品生成打印目录。这个过程很好。我们一直在努力解决的问题之一是如何为这些产品目录创建目录。

我决定使用 Scriptlet 功能来试一试。请注意,我们的报告本质上都是主详细信息,因为有一个主报告和一个子报告。

起初,我将 scriptlet 附加到主报告中,并试图找到一种方法来收集详细报告中的所有产品编号,然后将该值传递回主报告。我不知道如何将详细信息返回到主报表,因为您似乎只能将子报表中的默认变量传递回主报表(例如 PAGE_NUMBER、COLUMN_NUMBER、PAGE_COUNT、COLUMN_COUNT)。

然后我尝试将 Scriptlet 附加到详细报告中。嗯,明细报告不知道master在哪个页面,所以我开始把master的page_number传入明细报告中的一个变量中。效果很好,只是有时细节可能会溢出,以至于跳过母版的页码。换句话说,如果一个子报表返回超过两页的数据,那么下次调用子报表时,您将丢失一个页码。

那么怎么做呢?

【问题讨论】:

    标签: jasper-reports ireport


    【解决方案1】:

    我找到了一种可行的方法,类似于我上面的一个想法。首先,我无法获得子报表以将值返回给调用报表,然后使用 getVariableValue 从 scriptlet 中检索该值。我一直在尝试,但我无法让它发挥作用。

    相反,我采用了将相同的 scriptlet 附加到主报表和子报表的方法。该 scriptlet 有一个 class 变量,我可以在其中记录我在细节中遇到的所有产品编号,并且此代码位于 scriptlet 的 afterDetailEval() 方法中。请注意,我只想为子报表运行此代码,因此我检查是否存在永远不会为空的特定详细信息字段。如果不是,我不运行代码。因此,当主报告调用该事件时,代码不会运行。

    现在是我从示例中学到的部分。该示例中令人钦佩的副作用编程是有一行 1x1 维度,其中包含对“Print When Expression”属性中自定义 scriptlet 方法的调用。好主意啊!所以这个自定义方法无论如何都会返回 false ,并且该行永远不会打印。我在页脚区域做了同样的事情,这个方法从类变量中收集值,确定页面,并将结果存储在哈希中。然后它重置类变量。

    在报告摘要带中,我有另一行永远不会打印,它调用另一个自定义方法。我在这里所做的只是遍历产品编号的地图并显示每个出现的所有页面。完成!

    【讨论】:

    • 这整个过程还是把目录放在报表的最后吧?
    • 不,在我运行实际报告的 Java 代码中,我将 JasperPrint 对象收集到一个数组中。如果创建了 TOC,它会自动插入到数组的开头。
    【解决方案2】:

    在项目文件夹 jasperreports-x.x.x/demo/samples/tableofcontents 中有一个目录(带有子报告)示例。

    还可以查看超链接示例。

    超链接、锚点和书签

    JasperReports 允许您创建向下钻取报告,其中介绍了目录 在您的文档中或使用称为超链接的特殊报表元素将查看者重定向到外部文档。

    【讨论】:

    • 我从这个例子中学到了一些东西,但与我的情况不同的是,细节只有在子报表中才知道。此示例仅使用子报表打印来自主报表的组装详细信息。
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多