【问题标题】:Dynamic Alignment based on cell value (Content) in Jasper ReportsJasper Reports 中基于单元格值(内容)的动态对齐
【发布时间】:2014-04-16 13:24:10
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: java jasper-reports alignment textfield dynamic-jasper


    【解决方案1】:

    是的,有可能。

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

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

    【讨论】:

    • 嗨,@AlexK 非常好的答案..但不幸的是,我没有使用 DynamicReportBuilder 和 ColumnBuilder 类来构建我的报告。 :( 我正在使用 JRDesignTextField 并简单地将其添加到详细信息带中。我仍在尝试在我的架构中应用您的解决方案 :) 非常感谢,您的回答给了我另一种思维方式。
    • hi..@AlexK 如果可能的话,你能给我你的代码生成的 jrxml 文件 快照吗?它会帮助我。谢谢
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2020-08-28
      相关资源
      最近更新 更多