Jasper reports 如何水平、从左到右对齐文本字段及其标签&;在列中从上到下?

Jasper reports 如何水平、从左到右对齐文本字段及其标签&;在列中从上到下?,jasper-reports,Jasper Reports,我正在使用Jasper report和iReport,并以PDF格式导出报告 在我的报告中,我想添加动态的几个文本字段以及水平对齐的标签(从左到右&从上到下),如给定的3个示例 示例:所有8个标签都可用 Label1: $F{value1} Label2: $F{value2} Label3: $F{value3} Label4: $F{value4} Label5: $F{value5} La

我正在使用Jasper report和iReport,并以PDF格式导出报告

在我的报告中,我想添加动态的几个文本字段以及水平对齐的标签(从左到右&从上到下),如给定的3个示例

示例:所有8个标签都可用

Label1:   $F{value1}              Label2:    $F{value2}
Label3:   $F{value3}              Label4:    $F{value4}
Label5:   $F{value5}              Label6:    $F{value6}
Label7:   $F{value7}              Label8:    $F{value8}
Label1:   $F{value1}              Label4:    $F{value4}
Label6:   $F{value6}              
Label1:   $F{value1}              Label3:    $F{value3}
Label5:   $F{value5}              Label6:    $F{value6}
Label8:   $F{value8}
示例:只有3个标签(标签1、标签4、标签6)可用

Label1:   $F{value1}              Label2:    $F{value2}
Label3:   $F{value3}              Label4:    $F{value4}
Label5:   $F{value5}              Label6:    $F{value6}
Label7:   $F{value7}              Label8:    $F{value8}
Label1:   $F{value1}              Label4:    $F{value4}
Label6:   $F{value6}              
Label1:   $F{value1}              Label3:    $F{value3}
Label5:   $F{value5}              Label6:    $F{value6}
Label8:   $F{value8}
示例:只有5个标签(标签1、标签3、标签5、标签6、标签8)可用

Label1:   $F{value1}              Label2:    $F{value2}
Label3:   $F{value3}              Label4:    $F{value4}
Label5:   $F{value5}              Label6:    $F{value6}
Label7:   $F{value7}              Label8:    $F{value8}
Label1:   $F{value1}              Label4:    $F{value4}
Label6:   $F{value6}              
Label1:   $F{value1}              Label3:    $F{value3}
Label5:   $F{value5}              Label6:    $F{value6}
Label8:   $F{value8}
在我检查时,我看到ReportElement的positiontype参数只是试图保留从父报表部分的顶部/底部测量的“Y”偏移量

但在我的情况下,它是不同的,因为它也要考虑“X”偏移。


有谁能建议一下动态对齐的方法吗?

你说得对,你只能用位置类型在y位置移动/设置元素。我能想到的实现布局的“最快”方法是使用一个具有两列和水平打印顺序的子报表,但这意味着您需要为子报表创建一个数据源(
“label1”,$F{value1},$F{value2},$F{value2}…
),我将向您展示一些快速代码

  • 创建一个简单的类来保留标签和值

    public class LabelValue {
      private final String label;
      private final String value;
    
      public LabelValue(String label, String value) {
        this.label = label;
        this.value = value;
      }  
      public String getLabel() {
        return label;
      }  
      public String getValue() {
        return value;
      }
    }
    
  • 创建生成JRDatasource的方法调用

    public static JRDataSource getDatasource(String... fieldsValues) {
       List<LabelValue> vList = new ArrayList<>();
       for (int i = 0; i < fieldsValues.length-1; i=i+2) {
          //add to datasource only if value (2nd param is != null)
          if (fieldsValues[i+1]!=null) {
            vList.add(new LabelValue(fieldsValues[i],fieldsValues[i+1]));
          }
       }
       return new JRBeanCollectionDataSource(vList);
    }
    
  • 使用标签和字段调用子报表

    <subreport>
        <reportElement x="0" y="0" width="530" height="58" uuid="4e3cde2d-02a3-4929-8dda-0cf9d4c20dc1"/>
        <dataSourceExpression><![CDATA[my.package.DatasourceProvider.getDatasource(new String[]{"label1",$F{value1},"label2",$F{value2},"label3", $F{value3}, "label4",$F{value4},"label5",$F{value5},"label6", $F{value6}})]]></dataSourceExpression>
        <subreportExpression><![CDATA["C:\\...\\the_subreport.jasper"]]></subreportExpression>
    </subreport>
    
    
    
  • 如果value2、value3、value5为
    null