必须遵守本控件的自定函数约定才可以正常使用。
约定如下:
在本章节我们构建了一个UDF(User Define Function)的EXCEL函数,该函数只是简单返回定值“函数UDF返回值”,代码如下:
// 定义 UDF 类
export default class UDF {
// 定义静态私有变量 #instance
static #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 {
// 定义静态私有变量 instance
static 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返回值';
}
}
通过import等方式引入编辑好的公式类文件。
import UDF from './udf'
引入好自定义的类文件后,就可以通过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();
结果如下下图:
被调用的函数,入参分别是:
参数名称 | 含义 |
---|---|
valueParms | 定义函数括号内的内容,例如上面自定义udf()无参数。该参数可以是数量,金额,字符串,单元格地址等,结合使用场景使用。该值用数组形式传递 |
sheetName | 公式的sheet名称 |
workbook | workbook对象,方便函数使用 |
例如传递金额10给函数,在5.3小节获取该值。
/**
* 使用udf
*/
activeSheet.SetCellValue('A1', '=udf(10)');
返回值可以区分单值和数组两种情况,见表格:
返回值类型 | 含义 |
---|---|
单值 | 可以是数量,金额,字符串等,例如:UDF返回定值字符串 |
数组 | 使用两维数组返回的Array,第一维度是行,第二维度是列,包含的内容为Cell对象 |
本小节我们改写了上面的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;
}
结果如图片: