自定义函数解决多个数据集中求出某列的平均值
第20章 自定义函数解决多个数据集中求出某列的平均值 
1. 问题概述 
写一个自定义数据集函数,能够从多个数据集中求出某个列的平均值 
该函数的参数为指定数据集名称和列名 
请自行定义函数的参数类型和参数个数 
要求:可计算的数据集个数不定,列名由参数指定,也可以求同一个数据集的多个列的平均值,例如ds1有三个列col1\col2\col3,利用该函数可以求出这三个列的平均值;也可以求出ds1的col1\col2和ds2的col1\col2的平均值 
2. 报表展现与输出" target="_blank" class="geeznLink8">展现步骤 
1.写MyDSAvg.java继承润乾报表提供的function类, 实现其中的calculate方法,并返回运算结果 
2.在customFunctions.properties里做函数登记 
3. 用法格式: 
“数据集名字1″,”字段1,字段2,字段3″,”数据集名字2″,”字段1,字段2,字段3″ 
4.报表模板设计: 
 
为了检验数据的正确性,第2行和第3行取值对比 
 
3. 程序代码 
package api; 
import java.util.ArrayList; 
import com.runqian.base4.util.ReportError; 
import com.runqian.report4.dataset.DataSet; 
import com.runqian.report4.model.expression.Expression; 
import com.runqian.report4.model.expression.Function; 
import com.runqian.report4.model.expression.Variant2; 
import com.runqian.report4.usermodel.Context; 
public class MyDSAvg extends Function { 
private Context context = null; 
public Object calculate(Context context, boolean isInput) { 
this.context = context; 
ArrayList result = new ArrayList(); 
if(this.paramList.size()%2==1) 
throw new ReportError(“该函数需要偶数个参数!”); 
int count = this.paramList.size(); 
for(int i=0;i<count/2;i++){ 
Expression exp = (Expression)this.paramList.get(i*2); 
String dsName = (String)Variant2.getValue(exp.calculate(context, isInput), false, false); 
exp = (Expression)this.paramList.get(i*2+1); 
String[] cols = ((String)Variant2.getValue(exp.calculate(context, isInput), false, false)).split(“,”); 
for(int j=0;j<cols.length;j++){ 
String col = cols[j]; 
double avg = getDSAvg(dsName, col); 
result.add(new Double(avg)); 
} 
} 
return result; 
} 
public boolean isExtended() { 
return true
} 
private double getDSAvg(String dsName, String col) { 
DataSet ds = context.getDataSet(dsName); 
int colIndex = ds.getColNo(col); 
int rowCount = ds.getRowCount(); 
try{ 
double amount = 0; 
for(int i=1;i<=rowCount;i++){ 
double d = ((Number)ds.getData(i, colIndex)).doubleValue(); 
amount += d; 
} 
return (amount/rowCount); 
} 
catch(Exception e){ 
e.printStackTrace(); 
return 0; 
} 
} 
}