JasperReports 中如何让未打印的浮动元素向上补位?
结论
将三个列表组件分别放入独立的 detail band,并在每个 band 上设置对应的 printWhenExpression。组件在各自的 band 中从 y="0" 开始排版。条件不满足时,对应的 band 不会输出,后续 band 会接着排版,因此未打印的列表不会占用原先的固定间距。
positionType="Float" 主要用于处理元素因内容拉伸而产生的布局变化。它不会在组件不显示时,从同一个 band 中移除该组件并重新计算其他组件的起始位置。JasperReports 文档将 Float 的行为与 band 高度受拉伸影响时的位置调整联系起来。PositionTypeEnum 文档
调整方式
将现有组件拆分到三个 band 中。下面是结构示意。请将条件字段替换为现有表达式,并把对应的 componentElement 和 jr:list 内容放到注释所示的位置:
<detail>
<band height="100">
<printWhenExpression><![CDATA[$F{condition1} > 0]]></printWhenExpression>
<!-- 放第一个 componentElement,reportElement 的 y 设为 0 -->
</band>
<band height="100">
<printWhenExpression><![CDATA[$F{condition2} > 0]]></printWhenExpression>
<!-- 放第二个 componentElement,reportElement 的 y 设为 0 -->
</band>
<band height="100">
<printWhenExpression><![CDATA[$F{condition3} > 0]]></printWhenExpression>
<!-- 放第三个 componentElement,reportElement 的 y 设为 0 -->
</band>
</detail>
condition1、condition2 和 condition3 是示意用的占位名称,并非原问题提供的字段。请根据实际数据源和表达式替换。每个列表仍使用自己的 dataset,不需要合并。原片段中的组件分别从 y="10"、y="100" 和 y="200" 开始;拆分后,每个组件都从所在 band 的 y="0" 开始。band 的 height 应设置为组件所需的最小初始高度。如果列表内容会拉伸,请确认组件的拉伸设置和 band 高度能够容纳实际内容。官方 list 示例也展示了如何在报表 band 中使用 list 组件。List 组件示例
注意事项
如果将多个组件放在同一个 y 坐标为 0 的 frame 中,它们仍属于同一个布局容器,可能会相互重叠。仅把坐标改为 0,不会让组件依次占用空间。拆分为独立 band 后,请确认这三个 band 位于预期的报表节中,并检查分页时的表现。
备注:内容仅供参考。
