JRXML可以在使用之前扩展数据源吗?

时间:2016-04-26 08:21:25

标签: jasper-reports

我使用相同的数据源生成多个报告。其中一个报告需要在底部打印一些空行(“保留”),以便用户可以手动手动编写缺失数据。

E.g:

+---------+-------------+
| item 1  | bla bla     |
+---------+-------------+
| item 2  | foo         |
+---------+-------------+
|         |             |   <--- here user can just add forgotten
+---------+-------------+        items with a pen
|         |             |
+---------+-------------+

JRXML最简单的方法是在数据源末尾有几条null的记录。然后它只会根据需要打印其“细节”乐队几次没有文字。但是,数据源会重复用于其他报告,而这些报告当然不希望这样。

我可以在报告填充之前以某种方式将这些空行注入JRXML本身的数据源吗?

1 个答案:

答案 0 :(得分:1)

您可以修改CustomDataSource并从jrxml设置它以在需要时生成额外的记录:

示例

public class JRExtraEmptyRecordsDataSource extends JRBeanCollectionDataSource {

    private int nrOfEmptyRecords=0;
    private int currentExtraRecord = 0;

    public JRExtraEmptyRecordsDataSource(Collection<?> beanCollection) {
        super(beanCollection);
    }       

    @Override
    public Object getFieldValue(JRField field) throws JRException {
        if (currentExtraRecord==0){
            return super.getFieldValue(field);
        }
        Class<?> theCorrectClass = field.getValueClass();
        //Implement your logic to return correct class (reflection or switch) if you need speciall values
        //or just return null
        return null;
    }

    @Override
    public boolean next() {
        boolean next = super.next();
        if (next){
            return true;
        }
        currentExtraRecord++;
        return currentExtraRecord<=nrOfEmptyRecords;
    }

    @Override
    public void moveFirst() {
        super.moveFirst();
        currentExtraRecord=0;
    }


    public int getNrOfEmptyRecords() {
        return nrOfEmptyRecords;
    }

    public int setNrOfEmptyRecords(int nrOfEmptyRecords) {
        this.nrOfEmptyRecords = nrOfEmptyRecords;
        return this.nrOfEmptyRecords;//Lets return something for variable
    }

}

当您需要额外空记录时,在jrxml中添加此变量定义

<variable name="extraRecords" class="java.lang.Integer">
    <initialValueExpression><![CDATA[((my.package.JRExtraEmptyRecordsDataSource)$P{REPORT_DATA_SOURCE}).setNrOfEmptyRecords(2)]]></initialValueExpression>
</variable>

我没有自定义数据源我该怎么办?

通常没有自定义数据源,您可以使用带有columnFooter属性的isFloatColumnFooter="true"(或虚拟组页脚带)在详细信息的末尾显示额外信息带。可能我会选择这种方法,因为它有助于自定义额外的行并避免在正常的null频段中检查detail

如果需要动态指示空记录的数量,请包含一个空记录的子报表并作为数据源传递JREmptyDataSource

new net.sf.jasperreports.engine.JREmptyDataSource(P{nrOfEmptyRecords})