Implement Custom Calculation Engine to extend the Default Calculation Engine of Aspose.Cells with Node.js via C++

Implement Custom Calculation Engine

Aspose.Cells has a powerful calculation engine that can calculate almost all of the Microsoft Excel formulas. Despite this, it also allows you to extend the default calculation engine, which provides you greater power and flexibility.

The following property and classes are used in implementing this feature.

The following code implements the Custom Calculation Engine. It implements the interface AbstractCalculationEngine, which has a calculate(CalculationData data) method. This method is called for all of your formulas. Inside this method, we capture the TODAY function and add one day to the system date. So, if the current date is 27/07/2023, then the custom engine will calculate TODAY() as 28/07/2023.

Programming Sample

const AsposeCells = require("aspose.cells.node");

// Create a new class derived from AbstractCalculationEngine
class CustomEngine extends AsposeCells.AbstractCalculationEngine {
    // Override the calculate method with custom logic
    calculate(data) {
        // Check the formula name and change the implementation
        if (data.getFunctionName().toUpperCase() === "TODAY") {
            // Assign to CalculationData.CalculatedValue: add a one‑day offset to the date
            data.setCalculatedValue(
                AsposeCells.CellsHelper.getDoubleFromDateTime(new Date(), false) + 1.0
            );
        }
    }
    getProcessBuiltInFunctions() {
        return true;
    }
}

class ImplementCustomCalculationEngine {
    static run() {
        // Create an instance of Workbook
        const workbook = new AsposeCells.Workbook();

        // Access the first worksheet from the collection
        const sheet = workbook.getWorksheets().get(0);

        // Access cell A1 and set a formula
        const a1 = sheet.getCells().get("A1");
        const style = a1.getStyle();
        style.setNumber(14);
        a1.setStyle(style);

        a1.setFormula("=TODAY()");

        // Calculate all formulas in the Workbook 
        workbook.calculateFormula();

        // The result of A1 should be as per the default calculation engine
        console.log("The value of A1 with default calculation engine: " + a1.getStringValue());

        // Create an instance of CustomEngine
        const engine = new CustomEngine();

        // Create an instance of CalculationOptions
        const opts = new AsposeCells.CalculationOptions();

        // Assign the CalculationOptions.CustomEngine property to the instance of CustomEngine
        opts.setCustomEngine(engine);

        // Recalculate all formulas in Workbook using the custom calculation engine
        workbook.calculateFormula(opts);

        // The result of A1 will be as per the custom calculation engine
        console.log("The value of A1 with custom calculation engine: " + a1.getStringValue());

        console.log("Press any key to continue...");
    }
}

// Call the run method to execute the example
ImplementCustomCalculationEngine.run();

Result

Please check the console output of the above sample code; the value (date time) of A1 with the custom engine should be one day later than the result without the custom engine.

Related Article