使用 Jasper 报告在一份报告上打印动态数量的元素
Printing dynamic amount of elements on one report with Jasper reports
我在使用 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
所以最初的想法是打印一天的所有动作和图像,然后在第二天做同样的事情,直到database.Basically中没有天所有这些数据都应该打印出来作为一份报告,所有描述的内容一天又一天地详细介绍乐队。
基本上可以有任意数量的天数,然后是任意数量的与每一天相关的动作和图像。最好将所有这些内容打印成只有一列:首先是操作列表,然后是操作列表正下方的图像列表。
起初我试图实现这个 Jasper Studio,因为这是我迄今为止用于创建的所有其他报告的工具。
很快我就意识到,这种结构似乎不可能用 Studio 创建,至少在我看来是这样。
问题基本上是似乎无法将动态数量的表格添加到使用 Studio 创建的报告中。
这就是我开始研究 DynamicJasper 的原因。
如果我错了,请随时纠正我,但是这种结构可以通过使用 DynamicJasper 的子报表功能来实现吗?
如果我想让数据看起来像#being printed on one column,那么我肯定至少需要两个子报表定义。
这是因为将在这些列上打印两种完全不同的数据类型:操作是文本,图像是图像文件。
所以基本上在我的 DynamicJasper 代码中,我只是迭代所有来自数据库的日期并为每天创建 2 个子报告,所以我最终会创建 2*(天数)子报告并将所有这些连接到我的报告生成器。
这听起来像是可行的方法吗?
确切地说,我想我会在图像旁边的相邻列上打印图像的描述文本,只是为了让事情变得更容易....
让我们用 2 个子报表来做(也许我会在没有使用分组的情况下完成它)但是用子报表答案更短,你已经在考虑它了。
如果数据在数据库中..
在主报告中执行查询以按您喜欢的顺序查找所有日期。
详细地把日期字段设置成你想要的格式。
日期字段下方包含一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有操作。 (在其详细的 band put 操作字段中)
下面的操作子报表包含一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有图像。 (在其详细信息带中放置图像路径和文本)
大功告成!没有任何 jr:table 组件...
为什么我要用分组来做呢?因为这样我可以减少需要执行的查询的数量......但是现在如何给出它; )
编辑:OP 添加了他喜欢使用 beans 的评论
bean 应该是这样的(我删除了 setter 以减少代码 posted)
Main 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,所以不需要post代码。
步数
- 用动作和图像填充
DateBean
并将其放入 List<DateBean> datesBeans
- 将
new JRBeanCollectionDataSource(datesBeans)
作为数据源传递给主报表。
- 详细地带将字段
$F{date}
与一些格式
Date (1.1.2015)
- 在下面,包含一个子报表作为操作的子报表并作为数据源传递给子报表
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{actions})
注意 $F{actions}
的 class 需要是 java.util.List
。
- 在子报表的详细信息带中放置 $F{action}(因此数据源中过去的所有操作都将自动打印,因为它们在子报表的详细信息带中)。
-action1 (text)
-action2 . . .
-actionN
6-7。重复步骤 4 和 5,但使用另一个子报表中的 ImageBean
-image1 (image-file)
-image1 text (text)
-image2
-image2 text . . .
-imageN
-imageN text
就是这样...
Since the $F{date}
and subreport's are in the detail
band the output will be repeated on the main datasource hence the new JRBeanCollectionDataSource(datesBeans)
for all our DateBean
's
一般来说,解决方案是这样的:"in order to print report element(s) in a loop any amount of times in one report, place the element(s) to the detail band of the report and jasper will automatically print this set of elements as many times as there are beans in the collection passed for the report as main datasource/dataAdapter."
我在使用 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
所以最初的想法是打印一天的所有动作和图像,然后在第二天做同样的事情,直到database.Basically中没有天所有这些数据都应该打印出来作为一份报告,所有描述的内容一天又一天地详细介绍乐队。
基本上可以有任意数量的天数,然后是任意数量的与每一天相关的动作和图像。最好将所有这些内容打印成只有一列:首先是操作列表,然后是操作列表正下方的图像列表。
起初我试图实现这个 Jasper Studio,因为这是我迄今为止用于创建的所有其他报告的工具。
很快我就意识到,这种结构似乎不可能用 Studio 创建,至少在我看来是这样。
问题基本上是似乎无法将动态数量的表格添加到使用 Studio 创建的报告中。
这就是我开始研究 DynamicJasper 的原因。
如果我错了,请随时纠正我,但是这种结构可以通过使用 DynamicJasper 的子报表功能来实现吗?
如果我想让数据看起来像#being printed on one column,那么我肯定至少需要两个子报表定义。
这是因为将在这些列上打印两种完全不同的数据类型:操作是文本,图像是图像文件。
所以基本上在我的 DynamicJasper 代码中,我只是迭代所有来自数据库的日期并为每天创建 2 个子报告,所以我最终会创建 2*(天数)子报告并将所有这些连接到我的报告生成器。 这听起来像是可行的方法吗?
确切地说,我想我会在图像旁边的相邻列上打印图像的描述文本,只是为了让事情变得更容易....
让我们用 2 个子报表来做(也许我会在没有使用分组的情况下完成它)但是用子报表答案更短,你已经在考虑它了。
如果数据在数据库中..
在主报告中执行查询以按您喜欢的顺序查找所有日期。
详细地把日期字段设置成你想要的格式。
日期字段下方包含一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有操作。 (在其详细的 band put 操作字段中)
下面的操作子报表包含一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有图像。 (在其详细信息带中放置图像路径和文本)
大功告成!没有任何 jr:table 组件...
为什么我要用分组来做呢?因为这样我可以减少需要执行的查询的数量......但是现在如何给出它; )
编辑:OP 添加了他喜欢使用 beans 的评论
bean 应该是这样的(我删除了 setter 以减少代码 posted)
Main 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,所以不需要post代码。
步数
- 用动作和图像填充
DateBean
并将其放入List<DateBean> datesBeans
- 将
new JRBeanCollectionDataSource(datesBeans)
作为数据源传递给主报表。 - 详细地带将字段
$F{date}
与一些格式
Date (1.1.2015)
- 在下面,包含一个子报表作为操作的子报表并作为数据源传递给子报表
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{actions})
注意$F{actions}
的 class 需要是java.util.List
。 - 在子报表的详细信息带中放置 $F{action}(因此数据源中过去的所有操作都将自动打印,因为它们在子报表的详细信息带中)。
-action1 (text) -action2 . . . -actionN
6-7。重复步骤 4 和 5,但使用另一个子报表中的 ImageBean
-image1 (image-file) -image1 text (text) -image2 -image2 text . . . -imageN -imageN text
就是这样...
Since the
$F{date}
and subreport's are in thedetail
band the output will be repeated on the main datasource hence thenew JRBeanCollectionDataSource(datesBeans)
for all ourDateBean
's
一般来说,解决方案是这样的:"in order to print report element(s) in a loop any amount of times in one report, place the element(s) to the detail band of the report and jasper will automatically print this set of elements as many times as there are beans in the collection passed for the report as main datasource/dataAdapter."