jasperreports自定义数据源

使用的是jasperreports-5.6.0版本的包。


需求:  报表由一个基本Basic对象和一个集合类CustomList对象组成

问题:jasperreports没有提供类似可用的datasource类

解决方法:自定义一个DataSource实现JRDataSource接口即可

仿照JRBeanCollectionDataSource写了一个ReportDataSource,同样使其继承JRAbstractBeanDataSource,代码如下:

public class ReportDataSource extends JRAbstractBeanDataSource {
    /**
     *
     */
    private Collection data;
    private Iterator iterator;
    private Object currentBean;

    private Object basicData;//基本数据

    /**
     *
     */
    public ReportDataSource(Object basicData,Collection beanCollection)
    {
        this(basicData,beanCollection, true);
    }
    /**
     *
     */
    public ReportDataSource(Object basicData,Collection beanCollection, boolean isUseFieldDescription)
    {
        super(isUseFieldDescription);

        this.basicData = basicData;
        this.data = beanCollection;

        if (this.data != null)
        {
            this.iterator = this.data.iterator();
        }
    }


    /**
     *
     */
    public boolean next()
    {
        boolean hasNext = false;

        if (this.iterator != null)
        {
            hasNext = this.iterator.hasNext();

            if (hasNext)
            {
                this.currentBean = this.iterator.next();
            }
        }

        return hasNext;
    }


    /**
     *
     */
    public Object getFieldValue(JRField field) throws JRException
    {
        if(field.getName().contains("basic.")){
            return getBeanProperty(basicData,field.getName().split("\\.")[1]);
        }
        return getFieldValue(currentBean, field);
    }


    /**
     *
     */
    public void moveFirst()
    {
        if (this.data != null)
        {
            this.iterator = this.data.iterator();
        }
    }

    /**
     * Returns the underlying bean collection used by this data source.
     *
     * @return the underlying bean collection
     */
    public Collection getData()
    {
        return data;
    }

    /**
     * Returns the total number of records/beans that this data source
     * contains.
     *
     * @return the total number of records of this data source
     */
    public int getRecordCount()
    {
        return data == null ? 0 : data.size();
    }

    /**
     * Clones this data source by creating a new instance that reuses the same
     * underlying bean collection.
     *
     * @return a clone of this data source
     */
    public ReportDataSource cloneDataSource()
    {
        return new ReportDataSource(basicData,data);
    }
上面代码是修改JRBeanCollectionDataSource的,仅仅变动了几行代码而已,在jrmxl文件中就可以使用basic.属性名来标识Basic对象的属性了。


值得注意的是,如果CustomList为空,则无法输出报表,如果需要,可以在ReportDataSource构造器中增加  判断集合是否为空的代码,如果为空则初始化其长度为1的集合

你可能感兴趣的:(java报表)