websheet之 自定义函数

在线代码

一、自定义函数约定

必须遵守本控件的自定函数约定才可以正常使用。

         约定如下:

  • 自定义类名称与函数名称一致。(强制)
  • 该类方法名称与函数名称一致,该方法是函数的入口。(强制)
  • name的值与表格内使用的名称一致。(强制)
  • 函数建议构建成静态函数。

二、自定义UDF函数

         在本章节我们构建了一个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返回值';
      }
    }



三、注册自定义函数

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;
  }

         结果如图片:

posted @ 2025-04-29 11:10  火柴盒zhang  阅读(40)  评论(0)    收藏  举报