如何在运行时显示/隐藏列?

时间:2020-03-06 14:33:03  来源:igfitidea点击:

我想根据特定条件在运行时显示/隐藏列。我正在使用"表达式时打印"在报表中有条件地显示/隐藏此列(及其标题)。当隐藏该列时,它本应占用的空间留为空白,这并不是特别吸引人。

我希望如果以更有效的方式使用多余的空间,则可能包括:

  • 报告的宽度减去隐藏列的宽度
  • 多余的空间分布在其余的列之间

从理论上讲,我可以通过将列(和标题)的宽度设置为0来实现第一个目标,但是还可以指示该列应调整大小以适合其内容。但是JasperReports没有提供"调整宽度以适合内容"选项。

另一种可能性是使用Jasper API生成报告,而不是用XML定义报告模板。但这对于这样一个简单的要求似乎需要付出很多努力。

解决方案

如果只是一列,则可以将此列放在最右边,然后在表达式时使用print。这样,中间就没有孔了。我知道这是不理想的,因为我过去曾尝试做我们当前要完成的事情,却找不到我所谓的好解决方案。

第二个想法是在第一个报告的基础上创建第二个报告,但不包含该列,然后在调用报告时检查条件,以决定要调用哪个报告。再次不理想,但会起作用。

我知道这并不是我们要找的答案,但是其中一些建议可能对我们有用。

与我使用的"第二个报告"主题略有不同,是将报告的其中具有可选列的部分隔离到其自己的子报表中,然后创建两个子报表,一个带有和不带有该列的子报表,然后使用确定要打印哪个子报表的条件。

检查此内容在该教程中,他们使用带有Velocity框架的XML模板。这很复杂。为了简化起见,我们可以使用DynamicJasper。该库是可在JasperReports上运行的开源Java API,可解决动态列问题。

空白时删除行:如果此选项占用了对象所占用的垂直空间,则删除该行
不可见;元素的可见性由包含在
表达式属性时打印。将页面视为放置元素的网格,
一条线是元素所占据的空间。图4-17突出显示了元素A线;在
为了真正删除该行,共享该行一部分的所有元素都必须为null
(也就是说,它们不会被打印)。

我建议使用DynamicReports,它是开源的并且基于JasperReports。
该库的主要优点是动态报表设计,而无需可视报表设计器。