Я использую API DynamicJasper (3.0.13) для создания PDF.

Можно ли сохранить выравнивание значения поля по центру , если значение равно "-" , иначе по горизонтали . Мое текущее поле jrxml приведено ниже.

<textField>
    <reportElement uuid="105ab8ed-5b63" x="0" y="0" width="200" height="20"/>
        <textElement>
            <font size="15"/>
        </textElement>
        <textFieldExpression>
            <![CDATA[$F{firstName}]]>
        </textFieldExpression>
</textField>
2
Vishal Zanzrukia 16 Апр 2014 в 17:24

2 ответа

Лучший ответ

Наконец, я получил ответ в соответствии с моей структурой для создания динамического шаблона яшмы.

/**----------START------setting up conditional style and adding it in jasper design---------------*/
String expressionText = "$F{firstName}.trim().equals("-")";
JRDesignExpression cellExpression = new JRDesignExpression();
cellExpression.setText(expressionText);

JRDesignConditionalStyle conditionalCellStyle = new JRDesignConditionalStyle();
JRDesignStyle baseStyle = new JRDesignStyle();


conditionalCellStyle.setParentStyle(baseStyle);
conditionalCellStyle.setConditionExpression(cellExpression);
conditionalCellStyle.setHorizontalAlignment(HorizontalAlignEnum.CENTER);

baseStyle.setName("CONDITIONAL_STYLE");
baseStyle.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
baseStyle.setBold(Boolean.FALSE);
baseStyle.setItalic(Boolean.FALSE);
baseStyle.setStrikeThrough(Boolean.FALSE);
baseStyle.setUnderline(Boolean.FALSE);
baseStyle.addConditionalStyle(conditionalCellStyle);

getJasperDesign().addStyle(baseStyle); //(here getJasperDesign() is a object of JasperDesign)
/**---------END-------setting up conditional style and adding it in jasper design---------------*/


/**----------START------setting up my text field---------------*/
JRDesignTextField cellTextField = new JRDesignTextField();
/**---------------------setting all other properties of textField--------------------*/
cellTextField.setStyle(getJasperDesign().getStylesMap().get("CONDITIONAL_STYLE")); //(here getJasperDesign() is a object of JasperDesign)
/**----------END------setting up my text field---------------*/
0
Vishal Zanzrukia 1 Май 2014 в 13:50

Да, это возможно.

1) Вы можете использовать один из следующих методов: ColumnBuilder.addConditionalStyles или ColumnBuilder.addConditionalStyle

2) Вы должны реализовать свой собственный ConditionStyleExpression


Рабочий образец

Код

Код реализации ConditionStyleExpression < / а>:

public class FieldComparator extends ConditionStyleExpression implements CustomExpression {

    private String fieldName;
    private String valueToCheck;

    public FieldComparator(String fieldName, String valueToCheck) {
        this.fieldName = fieldName;
        this.valueToCheck = valueToCheck;
    }

    @Override
    public Object evaluate(Map fields, Map variables, Map parameters) {
        Object value = getCurrentValue();
        if (value == null)
            return null;

        if (!fields.containsKey(fieldName)) {
            return Boolean.FALSE;
        }

        if (valueToCheck == null) {
            return Boolean.FALSE;
        }

        return Boolean.valueOf(valueToCheck.equals(fields.get(fieldName)));
    }

    @Override
    public String getClassName() {
        return Boolean.class.getName();
    }
}

Я сравнил значение поля со строкой, переданной через параметр.

Код для построения отчета:

public class ConditionalStylesTest extends BaseDjReportTest {

    public static void main(String[] args) throws Exception {
        ConditionalStylesTest test = new ConditionalStylesTest();
        test.testReport();
        test.exportToJRXML();
        JasperViewer.viewReport(test.jp);
    }

    @Override
    public DynamicReport buildReport() throws Exception {
        DynamicReportBuilder drb = new DynamicReportBuilder();
        Integer margin = 20;
        drb.setTitle("NBA Players")
                .setTitleHeight(30)
                .setDetailHeight(15)
                .setLeftMargin(margin)
                .setRightMargin(margin)
                .setTopMargin(margin)
                .setBottomMargin(margin)
                .setPrintBackgroundOnOddRows(true)
                .setColumnsPerPage(1)
                .setColumnSpace(1);

        drb.addColumn(ColumnBuilder.getNew().setColumnProperty("age", Integer.class.getName())
                .setTitle("Age").setWidth(30).setFixedWidth(true).build());
        drb.addColumn(ColumnBuilder.getNew().setColumnProperty("name", String.class.getName())
                .setTitle("Name").setWidth(100).setFixedWidth(true).build());
        drb.addColumn(ColumnBuilder.getNew().setColumnProperty("currentTeam", String.class.getName())
                .setTitle("Team").setWidth(120).addConditionalStyle(createConditionalStyle()).setFixedWidth(true).build());

        drb.setUseFullPageWidth(true);

        return drb.build();
    }

    private ConditionalStyle createConditionalStyle() {
        Style style = new Style();
        style.setHorizontalAlign(HorizontalAlign.CENTER);

        ConditionStyleExpression expression = new FieldComparator("currentTeam", "-");

        return new ConditionalStyle(expression, style);
    }

    @Override
    protected JRDataSource getDataSource() {
        return new JRBeanCollectionDataSource(Players.get());
    }
}

В этом примере я использовал источник данных JavaBean . И я использовал условный стиль для поля currentTeam .

Компонент Player :

public class Player {

    private Integer age;
    private String name;
    private String currentTeam;

    public Player(Integer age, String name, String team) {
        this.age = age;
        this.name = name;
        this.currentTeam = team;
    }

    public Integer getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public String getCurrentTeam() {
        return currentTeam;
    }
}

Результат

Результат, созданный в JasperViewer :

enter image description here

Как видите, строка "-" имеет выравнивание по центру .

2
Alex K 27 Апр 2014 в 17:45