用JavaScript用C++实现扩展Aspose.Cells默认计算引擎的自定义计算引擎
Contents
[
Hide
]
实现自定义计算引擎
Aspose.Cells具有强大的计算引擎,可以计算几乎所有的Microsoft Excel公式。尽管如此,它还允许您扩展默认的计算引擎,从而为您提供更大的动力和灵活性。
在实现此功能中使用了以下属性和类。
以下代码实现了自定义计算引擎。它实现了接口 AbstractCalculationEngine,其中包含一个 calculate(CalculationData data) 方法。该方法会对所有公式调用。在此方法中,我们捕获 TODAY 函数并在系统日期基础上加一天。因此,如果当前日期是 2023/07/27,则自定义引擎会将 TODAY() 计算为 2023/07/28。
编程示例
<!DOCTYPE html>
<html>
<head>
<title>Custom Calculation Engine Example</title>
</head>
<body>
<h1>Custom Calculation Engine Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample" disabled>Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat, CalculationOptions, CellsHelper } = AsposeCells;
AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: [
"arial.ttf",
"NotoSansSC-Regular.ttf"
]
}).then(() => {
console.log("Aspose.Cells initialized");
document.getElementById('runExample').disabled = false;
});
// Create a new class derived from AbstractCalculationEngine
class CustomEngine extends AsposeCells.AbstractCalculationEngine {
constructor() {
super();
// Indicate processing built-in functions
this.processBuiltInFunctions = true;
}
// Override the Calculate method with custom logic
calculate(data) {
// Check the formula name and change the implementation
if (data.functionName.toUpperCase() === "TODAY") {
// Assign the CalculationData.CalculatedValue: add one day offset for the date
data.calculatedValue = CellsHelper.getDoubleFromDateTime(new Date(), false) + 1.0;
}
}
}
class ImplementCustomCalculationEngine {
static run() {
// Create an instance of Workbook
const workbook = new Workbook();
// Access first Worksheet from the collection
const sheet = workbook.worksheets.get(0);
// Access Cell A1 and put a formula to sum values of B1 to B2
const a1 = sheet.cells.get("A1");
const style = a1.style;
style.number = 14;
a1.style = style;
a1.formula = "=TODAY()";
// Calculate all formulas in the Workbook
workbook.calculateFormula();
// The result of A1 with default calculation engine
console.log("The value of A1 with default calculation engine: " + a1.stringValue);
// Create an instance of CustomEngine
const engine = new CustomEngine();
// Create an instance of CalculationOptions
const opts = new CalculationOptions();
// Assign the CalculationOptions.CustomEngine property to the instance of CustomEngine
opts.customEngine = engine;
// Recalculate all formulas in Workbook using the custom calculation engine
workbook.calculateFormula(opts);
// The result of A1 with custom calculation engine
console.log("The value of A1 with custom calculation engine: " + a1.stringValue);
console.log("Press any key to continue...");
document.getElementById('result').innerHTML = '<p style="color: green;">Calculation completed. Check console for output.</p>';
}
}
document.getElementById('runExample').addEventListener('click', () => {
ImplementCustomCalculationEngine.run();
});
</script>
</html>
结果
请检查上述示例代码的控制台输出;使用自定义引擎后,单元格 A1 的日期时间值应比未使用该引擎时的结果晚一天。