活字格自定义公式(JS):计算字符串表达式

概述

在活字格中通过 JavaScript 创建自定义公式 geteval,实现字符串数学表达式的计算,如将 "1*50" 计算为 50。活字格底层使用 SpreadJS,支持通过其 API 扩展公式。

完整代码

// 计算字符串公式的值,比如 "1*50" 计算结果为 50
function GetEval() {
    this.name = "geteval";
    this.maxArgs = 1;
    this.minArgs = 1;
}

GetEval.prototype = new GC.Spread.CalcEngine.Functions.Function();

GetEval.prototype.evaluate = function(args) {
    try {
        var expr = arguments[0] == null ? "0" : arguments[0].replace("=", "");
        return eval(expr);
    } catch (error) {
        return 0;  // 非法表达式返回 0
    }
};

// 注册自定义公式
GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction(
    "geteval",
    new GetEval()
);

使用方式

=geteval("100*2+50")   // 返回 250
=geteval(A1)            // 计算 A1 单元格中的字符串表达式
=geteval("2^10")        // 返回 1024

关键说明

  • GC.Spread.CalcEngine.Functions.Function():SpreadJS 自定义公式基类
  • this.name:公式名称,即表格中使用的函数名
  • maxArgs / minArgs:参数个数限制
  • eval():JavaScript 内置函数,将字符串作为代码执行
  • arguments[0].replace("=", ""):去除可能存在的等号前缀

安全提醒

注意:eval() 存在安全风险,可能执行恶意代码。仅在可信数据源中使用此公式,避免在用户输入场景下使用。如需要更安全的方案,可自行解析四则运算表达式。

安全替代方案(纯四则运算)

// 使用 Function 构造器(比 eval 稍安全)
GetEval.prototype.evaluate = function(args) {
    try {
        var expr = arguments[0] == null ? "0" : arguments[0];
        return new Function("return " + expr)();
    } catch (error) {
        return 0;
    }
};

标签: