使用Jasper报告在一个报告上打印动态数量的元素

时间:2015-11-11 16:19:06

标签: java jasper-reports dynamic-jasper

使用JasperReports Studio / DynamicJasper打印以下类型的结构时遇到问题:

Date (1.1.2015)
-action1 (text)
-action2
.
.
.
-actionN

-image1      (image-file)
-image1 text (text)
-image2
-image2 text
.
.
.
-imageN
-imageN text

Date (2.1.2015)
-action1 (text)
-action2
.
.
.
-actionN

-image1      (image-file)
-image1 text (text)
-image2
-image2 text
 .
 .
 .
-imageN
-imageN text

所以最初的想法是打印一天所附的所有动作和图像,然后在第二天做同样的事情,直到数据库中没有天。基本上所有这些数据都应打印为一个报告全部所描述的内容将在一天之后转到详细的乐队。

基本上可以有任何天数,然后是每天相关的任何数量的动作和图像。最好将所有这些内容打印成只有一列:首先是动作列表,然后是动作列表正下方的图像列表。

起初我试图实现这个Jasper Studio,因为这是我迄今为止用于创建的所有其他报告的工具。

很快我意识到,这种结构似乎不可能用Studio创建,至少就我看来而言。

问题基本上是似乎无法在使用Studio创建的报表中添加动态数量的表。

这就是我开始调查DynamicJasper的原因。

如果我错了,请随意纠正我,但是使用DynamicJasper的子报告功能可以使用DynamicJasper实现这种结构吗?

看起来我肯定需要至少两个子报表定义,如果我想要显示数据,就像在一列上打印#being一样“。

这是因为在这些列上会打印两种完全不同的数据类型:操作是文本,图像是图像文件。

所以基本上在我的DynamicJasper代码中,我只是迭代来自数据库的所有日期并为每天创建2个子报告,所以我最终会创建2 *(天数)子报告并将所有这些连接到我的reportbuilder 。 这听起来像是可行的吗?

确切地说,我想我会在图像旁边的相邻列上打印图像的描述文本,以简化操作....

2 个答案:

答案 0 :(得分:0)

让我们用2个子报告(也许我会在没有并使用分组的情况下完成它)但是使用子报告时答案更短,你已经在考虑它了。

如果数据在数据库中..

  1. 在主报告中执行查询以按您喜欢的顺序查找所有日期。

  2. 详细说明乐队将日期字段格式化为您想要的格式。

  3. 以下日期字段包括子报表,将日期作为参数传递,并在子报表执行查询中查找该日期的所有操作。 (在其详细的乐队放置行动领域)

  4. 在操作子报表下面包含子报表,将日期作为参数传递,在子报表执行查询中查找该日期的所有图像。 (在其详细的乐队中放置图像路径和文字)

  5. 你做完了!,没有用于任何jr:table组件......

    为什么我要用分组来做呢?因为这样我可以减少需要执行的查询数量...但是现在如何给出这个; )

    编辑:OP补充评论说他喜欢使用豆子

    bean会是这样的(我删除了setter以减少发布的代码)

    主要的bean DateBean

    public class DateBean {
        private Date date;
        private List<ActionBean> actions;
        private List<ImageBean> images;
        public Date getDate() {
            return date;
        }
        public List<ActionBean> getActions() {
            return actions;
        }
        public List<ImageBean> getImages() {
            return images;
        }   
    }
    

    ActionBean

    public class ActionBean {
        private String action;
        public String getAction() {
            return action;
        }
    }
    

    ImageBean

    这与ActionBean几乎相同,因此无需发布代码。

    <强>步骤

    1. 使用操作和图片填写DateBean并将其放入List<DateBean> datesBeans
    2. new JRBeanCollectionDataSource(datesBeans)作为数据源传递给主报告。
    3. 详细说明,乐队将字段$F{date}添加了一些格式
    4.   

      日期(2015年1月1日)

      1. 下面,包含操作的子报告,并将数据源作为数据源传递到子报告new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{actions}),注意$F{actions}的类需要java.util.List
      2. 在子报告的详细信息区域中放置$ F {action}(因此,数据源中的所有操作将自动打印,因为它们位于子报表的详细信息区域中。)
      3.   

        -action1(文字)    - action2。 。 。   -actionN

        6-7。重复步骤4和5,但在另一个子报告中使用ImageBean

          

        -image1(图像文件)   -image1 text(text)   -image2   -image2文字。 。 。   -imageN   -imageN text

        就是这样......

          

        由于$F{date}和子报告位于detail范围内,因此输出将在主数据源上重复,因此我们所有new JRBeanCollectionDataSource(datesBeans)的{​​{1}}

答案 1 :(得分:0)

一般来说,解决方案是这样的:“为了在一个报告中循环打印报告元素,将元素放置到报告的细节带中,jasper将自动打印一组元素,因为集合中的bean作为主数据源/ dataAdapter传递给报表。“