读取同一报表已算数据集
业务场景
由于同一报表支持多数据集,因此有时会遇到这样的需求:同一个报表中,某个数据集的生成依赖于另一个数据集的结果数据。
为了实现这种依赖关系,同时也为了避免循环引用等,报表中规定了数据集的运算顺序:严格按照定义时的顺序进行运算。即定义在前面的数据集先算,定义在后面的后算,后面的数据集可以引用前面的数据集。
例如本示例中的具体业务场景如下:
- 报表中已经定义有一个名称为degree的数据集,存放学位数据,其中有ID、NAME字段,对应存放学位的ID值与中文名称值,数据集的结构与数据如下图所示
- 此外还定义了一个自定义数据集,内有人员信息数据,其中有人员的学位ID值,现在要实现自定义数据集可以从degree数据集中读取数据,将字段学位ID数值转为degree数据集的中文学历名
示例代码
以下是该示例的实现代码:
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;
}
}