实现数据集工厂类

根据实际业务的需要,基于IDataSetFactory接口创建数据集工厂实现类,在createDataSet()方法中实现客户化的数据集对象DataSet生成方式。

实例化DataSet的方法

构造自定义数据集,本质上是实例化DataSet。

进行DataSet的实例化可按以下步骤进行:

创建DataSet对象时开发者可以根据实际情况使用合适的构造方法。

下面给出两种创建DataSet对象的参考示例:

简单方式创建DataSet对象

使用DataSet(java.lang.String dataSetName)实例化,示例代码如下:

/*
* new DataSet()时可以使用不同构造方法。
* 如果实例化时不初始化列数和行数,则可以使用一个指定数据集名称的参数来实例化即可。
* 可以直接用一个字符串设置实例化DataSet时的名字,需要与数据集时保存的名称一致
* 也可以使用DataSetConfig.getName()方法,来动态的获取当前数据集的名称
* 如果想实例化DataSet时,不受名称限制,可以使用DataSet ds = new DataSet(null) 的方式实例化
*/
DataSet ds = new DataSet("ds1");
//增加列名id
ds.addCol("id");
ds.addCol("name"); 
ds.addCol("degree");
//循环创建10行数据
for( int i = 1; i <= 10; i++ ) {
    Row row = ds.addRow();
    row.setDataInt(1, i);
    row.setData(2, "name"+i);
    row.setData(3, i);
}

 

指定数据集行、列数并使用列信息对象创建DataSet对象

使用DataSet(int initRowCap, int colCount, java.lang.String dataSetName) 实例化,指定实例化时数据集对象的列数和行数,并且使用列信息对象封装多项列信息。

示例代码如下:

//定义实例化时的行数、列数,,一般与实际列数相等为宜
int rowCount=3;
int colCount=3;     
String dsName="ds2";//定义数据集名
String[] colNames={"id","name","age"};//定义列名数组
String[] titleNames={"编号","姓名","年龄"};//定义列中文名数组
//构造数据集时候建议可以指定差不多的行数、列数,可以避免每次追加行、列时不停地分配空间
DataSet ds = new DataSet(rowCount, colCount, dsName);
//添加列,注意:添加列要在添加行之前
for (int i = 0; i < colCount; i++) {    
    ColInfoBase ci = newColInfoBase();//逐列构造列信息对象
    ci.setColName(colNames[i]);//设置列英文名
    ci.setColTitle(titleNames[i]);//设置列中文名,可用作别名
    ci.setDataType(com.runqian.report4.usermodel.Types.DT_STRING);  //设置列的数据类型
    ds.addColInfo(ci);//若数据集运算时不需要如此多的信息,可直接调用ds.addCol(colName)即可
}
//添加行,设置数据集中的数据
for (inti = 0; i < rowCount; i++) {
    Row row = ds.addRow();
    row.setDataInt(1, i);
    row.setData(2, "name"+i);
    row.setDataInt(3, i*2);
}

 

数据集工厂实现类完整示例

以下是自定义数据集工厂类的一个完整实现代码:

package com.api;
import com.runqian.report4.usermodel.*;
import com.runqian.report4.dataset.*;
public class MyDataSet implements IDataSetFactory{
    public DataSet createDataSet (Context ctx, DataSetConfig dsc, boolean retrieve){
        DataSet ds = new DataSet(null); //dataset名要与设计报表时取的数据集名称一致,若想不受限制,可以使用DataSet ds= new DataSet(null)
        //创建String数据,存储列名
        String[] colNames={"empid","empname","degree"};
        //增加列
        for(inti=0;i<colNames.length;i++){
            ds.addCol(colNames[i]);
        }
        //创建二维数组,保存姓名以及学历编码
        String [][]empinfo={{"张三","3"},{"李四","7"},{"王五","9"},{"小刘","5"},{"小李","2"}};
        //循环遍历二维数据的数据,分别作为数据集的姓名和学历字段值
        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, empinfo[i][1]);
        }
        return ds;
    }
}