websheet之 自定义函数
在线代码
{.is-success}
一、自定义函数约定
必须遵守本控件的自定函数约定才可以正常使用。
{.is-warning}
约定如下:
- 自定义类名称与函数名称一致。(强制)
- 该类方法名称与函数名称一致,该方法是函数的入口。(强制)
- name的值与表格内使用的名称一致。(强制)
- 函数建议构建成静态函数。
二、自定义UDF函数
在本章节我们构建了一个UDF(User Define Function)的EXCEL函数,该函数只是简单返回定值“函数UDF返回值”,代码如下:
// 定义 UDF 类
export default class UDF {// 定义静态私有变量 #instancestatic #instance: UDF | null = null;// 定义类的属性public name!: string;// 返回值类型public returnValueType: string = 'S'; // 文本// public returnValueType: string = 'N'; // 数值// 构造函数constructor() {if (!UDF.#instance) {UDF.#instance = this;this.name = 'udf';//与表格内使用的公式名称一致this.returnValueType = 'S'; // 文本}}// 静态方法,用于获取单例实例public static getInstance(): UDF {if (!this.#instance) {this.#instance = new UDF();}return this.#instance;}// 定义 UDF 方法 传入参数和返回值见第五小节public UDF(pram: any, sheetname: string, workbook: any, formula: any): string {console.log(pram.toString());return '函数UDF返回值';}
}
HTML中的写法:
// 定义 UDF 类class UDF {// 定义静态私有变量 instancestatic instance = null;// 定义类的属性name;returnValueType;// 构造函数constructor() {if (!UDF.instance) {UDF.instance = this;this.name = 'udf'; // 与表格内使用的公式名称一致this.returnValueType = 'S'; // 文本}return UDF.instance;}// 静态方法,用于获取单例实例static getInstance() {if (!this.instance) {this.instance = new UDF();}return this.instance;}// 定义 UDF 方法 传入参数和返回值见第五小节UDF(pram, sheetname, workbook, formula) {console.log(pram.toString());return '函数UDF返回值';}}
三、注册自定义函数
3.1 引入文件
通过import等方式引入编辑好的公式类文件。
import UDF from './udf'
3.2 注册
引入好自定义的类文件后,就可以通过workbook.AddUserDefineFunction(…)方法组成函数,代码如下:
let workbook = wsheet.Workbook(); workbook.AddUserDefineFunction(UDF);
四、表格内使用
本例中设置了‘A1’单元格式公式为:
/*** 第一步 获取workbook*/let workbook = wsheet.Workbook();/*** 第二步 注册自定义函数*/workbook.AddUserDefineFunction(UDF);let activeSheet = wsheet.ActiveSheet();/*** 使用udf*/activeSheet.SetCellValue('A1', '=udf()');/*** 第三步 重新绘制表格*/activeSheet.setColWidth(1, 160);activeSheet.WorkFormula(); //重建公式activeSheet.cacl();//公式计算wsheet.BuildSheet();wsheet.Draw();
结果如下下图:
五、传入参数和返回值
5.1 传入参数
被调用的函数,入参分别是:
参数名称 | 含义 |
---|---|
valueParms | 定义函数括号内的内容,例如上面自定义udf()无参数。该参数可以是数量,金额,字符串,单元格地址等,结合使用场景使用。该值用数组形式传递 |
sheetName | 公式的sheet名称 |
workbook | workbook对象,方便函数使用 |
例如传递金额10给函数,在5.3小节获取该值。
/*** 使用udf*/activeSheet.SetCellValue('A1', '=udf(10)');
5.2 返回值
返回值可以区分单值和数组两种情况,见表格:
返回值类型 | 含义 |
---|---|
单值 | 可以是数量,金额,字符串等,例如:UDF返回定值字符串 |
数组 | 使用两维数组返回的Array,第一维度是行,第二维度是列,包含的内容为Cell对象 |
5.3 返回数组的例子
本小节我们改写了上面的UDF函数,是其返回一个五行五列的数组,代码如下:
public UDF(pram: any, sheetname: string, workbook: any, range: any): [] {//console.log(pram.toString());//获取参数 console.log(pram[0]); //这里将打印10的值let rowVale = [];for (let i = 0; i < 5; i++) {let colValues = [];for (let c = 0; c < 5; c++) {let cell = new WebSheet.Model.Cell();cell.value = 'row=' + (i + 1) + ' col=' + (c + 1);colValues.push(cell);}rowVale.push(colValues);}return rowVale;}
结果如图片: