Как выровнять текстовые поля и их метки по горизонтали, слева направо и сверху вниз в столбцах? - PullRequest
1 голос
/ 10 января 2020

Я использую отчет Jasper и iReport и экспортирую отчет в формате PDF.

В свой отчет я хочу добавить динамические c несколько текстовых полей вместе с их метками, выровненными по горизонтали (слева направо и сверху вниз) как и в приведенных 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}

Пример: доступны только 3 метки (метка 1, метка 4, метка 6)

Label1:   $F{value1}              Label4:    $F{value4}
Label6:   $F{value6}              

Пример: доступны только 5 меток (Метка 1, Метка 3, Метка 5, Метка 6, Метка 8)

Label1:   $F{value1}              Label3:    $F{value3}
Label5:   $F{value5}              Label6:    $F{value6}
Label8:   $F{value8}

Насколько я проверил, я вижу тип позиции Аргумент ReportElement просто пытается сохранить смещение "Y", измеренное от верхней / нижней части родительского раздела отчета.

Но в моем случае это не так, как и смещение "X".

Может ли кто-нибудь предложить способ динамического выравнивания этого?

1 Ответ

0 голосов
/ 10 января 2020

Вы правы, вы можете перемещать / устанавливать элементы только в позиции y с помощью Position Type. «Самый быстрый» способ, которым я могу придумать для достижения вашей компоновки, - это использовать подотчет с 2 столбцами и горизонтальным порядком печати, но это означает, что вам нужно создать источник данных для подотчета ("label1",$F{value1},"label2",$F{value2}...). Я покажу вам некоторые быстрый код

  1. Создание простого класса для хранения метки и значений.

    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;
      }
    }
    
  2. Создание вызова метода, генерирующего 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);
    }
    
  3. Создать подотчет с 2 столбцами и printOrder="Horizontal"

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="subReportColonne" columnCount="2" printOrder="Horizontal" pageWidth="555" pageHeight="842" whenNoDataType="BlankPage" columnWidth="277" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="597c0716-df6b-42ec-a7c8-863eb1b7174a">
    <field name="label" class="java.lang.String"/>
    <field name="value" class="java.lang.String"/>
    <detail>
        <band height="20" splitType="Stretch">
            <property name="com.jaspersoft.studio.unit.height" value="px"/>
            <textField>
                <reportElement x="0" y="0" width="130" height="20" uuid="34bf2bee-16f1-49b6-bfe5-a82ac94e6086">
                    <property name="com.jaspersoft.studio.unit.height" value="px"/>
                </reportElement>
                <box leftPadding="3"/>
                <textElement textAlignment="Left" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{label}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="130" y="0" width="140" height="20" uuid="58d18846-5a61-4a56-b9d8-6ac0ac499510">
                    <property name="com.jaspersoft.studio.unit.height" value="px"/>
                </reportElement>
                <box leftPadding="3"/>
                <textElement textAlignment="Left" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    </jasperReport>
    
  4. Вызвать подотчет с метками и полями

    <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>
    

Результат, если значение2, значение3, значение5 равно null

Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...