2

我正在使用 DynamicJasper (3.0.13) API 来生成 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>
4

2 回答 2

2

是的,有可能。

1)您可以使用以下方法之一:ColumnBuilder.addConditionalStylesColumnBuilder.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字段使用了条件样式。

播放器

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中生成的结果:

在此处输入图像描述

如您所见,字符串"-"具有居中对齐方式。

于 2014-04-27T17:32:24.987 回答
0

最后我得到了根据我创建动态碧玉模板的结构的答案。

/**----------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---------------*/
于 2014-05-01T13:50:52.660 回答