读取同一报表已算数据集

业务场景

由于同一报表支持多数据集,因此有时会遇到这样的需求:同一个报表中,某个数据集的生成依赖于另一个数据集的结果数据。

为了实现这种依赖关系,同时也为了避免循环引用等,报表中规定了数据集的运算顺序:严格按照定义时的顺序进行运算。即定义在前面的数据集先算,定义在后面的后算,后面的数据集可以引用前面的数据集。

例如本示例中的具体业务场景如下:

示例代码

以下是该示例的实现代码:

package com.api;
import com.runqian.report4.usermodel.*;
import com.runqian.report4.dataset.*;
public class MyDataSet2 implements IDataSetFactory {
    public DataSet createDataSet(Context ctx, DataSetConfig dsc, boolean retrieve) {
        String dsName=dsc.getName();//获取用户保存的数据集名字
        DataSet ds = new DataSet(3,dsName); //DataSet(int colCount,String dataSetName)构造方法
        // 创建String数据,存储列名
        String[] colNames = { "empid", "empname", "degree" };
        // 增加列
        for (int i = 0; i < colNames.length; i++) {
            ds.addCol(colNames[i]);
        }
        // 创建二维数组,保存姓名以及学历编码
        String[][] empinfo = { { "张三", "3" }, { "李四", "7" }, { "王五", "9" }, { "小刘", "5" }, { "小李", "2" } };
        // 根据数据集的名称获取已算出的数据集,字段为ID,NAME
        DataSet degree = ctx.getDataSet("degree");
        // 循环遍历二维数据的数据,分别作为数据集的姓名和学历字段值
        for (int i = 0; i < empinfo.length; i++) {
            // 增加一行行数
            Row row = ds.addRow();
            row.setDataInt(1, i);
            row.setData(2, empinfo[i][0]);
            row.setData(3, getDegreeName(degree, "ID", "NAME", empinfo[i][1]));
        }
        return ds;
    }
    /**
     * 从数据集中ds循环遍历指定的字段id_colname,根据id_colname_value,获取对应name_colname字段的name_colname_value
     * @param ds
     * @param id_colname
     * @param name_colname
     * @param id_colname_value
     * @return name_colname_value
     */
    public String getDegreeName(DataSet ds, String id_colname, String name_colname, String id_colname_value) {
        String name_colname_value = "";
        // 若ds为null,或者数据集中没有指定的字段,直接返回null
        if (ds == null || !isRightCol(ds, id_colname) || !isRightCol(ds, name_colname)) {
            return null;
        } else {
            int rowCount = ds.getRowCount();// 获得数据集的行数列数
            int id_colNum = ds.getColNo(id_colname);// 获取指定字段的列号
            int name_colNum = ds.getColNo(name_colname);
            for (int i = 1; i <= rowCount; i++) {// 注意数据集的行号列号从1开始
                if (id_colname_value.endsWith((String) ds.getData(i, id_colNum)))// 逐行获取指定字段的值(id)并与目标值对比,为true时说明已经找到正确行号
                    name_colname_value = (String) ds.getData(i, name_colNum);// 获取正确行列的字段值(name)
            }
        }
        return name_colname_value;
    }
    /**
     * 用于判断数据集中是否有指定的字段
     * @param ds
     * @param colname
     * @return
     */
    public boolean isRightCol(DataSet ds, String colname) {
        String[] colnames = ds.getColNames();// 获取数据集中的字段名集合
        for (int i = 0; i < colnames.length; i++) {// 遍历数组,找到字段则返回ture,否则返回false
            if (colname.endsWith(colnames[i])) {
                return true;
            }
        }
        return false;
     }
}