Calculate Formulas with JavaScript via C++
Adding Formulas & Calculating Results
Aspose.Cells has an embedded formula calculation engine. Not only can it re-calculate formulas imported from designer templates, but it also supports calculating the results of formulas added at runtime.
Aspose.Cells supports most of the formulas or functions that are part of Microsoft Excel (Read a list of the functions supported by the calculation engine). Those functions can be used through the APIs or designer spreadsheets. Aspose.Cells supports a huge set of mathematical, string, boolean, date/time, statistical, database, lookup, and reference formulas.
Use the formula property or formula(string, object) methods of the Cell class to add a formula to a cell. When applying a formula, always begin the string with an equal sign (=) as you do when creating a formula in Microsoft Excel and use a comma (,) to delimit function parameters.
To calculate the results of formulas, the user may call the calculateFormula() method of the Workbook class which processes all formulas embedded in an Excel file. Or, the user may call the calculateFormula(string) method of the Worksheet class which processes all formulas embedded in a sheet. Or, the user may also call the calculate(CalculationOptions) method of the Cell class which processes the formula of one Cell:
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">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, Worksheet, Cell } = 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').addEventListener('click', async () => {
// Instantiate a new Workbook object
const workbook = new Workbook();
// Add a new worksheet to the Excel object
const sheetIndex = workbook.worksheets.add();
// Obtain the reference of the newly added worksheet by passing its sheet index
const worksheet = workbook.worksheets.get(sheetIndex);
// Adding a value to "A1" cell
const cellA1 = worksheet.cells.get("A1");
cellA1.value = 1;
// Adding a value to "A2" cell
const cellA2 = worksheet.cells.get("A2");
cellA2.value = 2;
// Adding a value to "A3" cell
const cellA3 = worksheet.cells.get("A3");
cellA3.value = 3;
// Adding a SUM formula to "A4" cell
const cellA4 = worksheet.cells.get("A4");
cellA4.formula = "=SUM(A1:A3)";
// Calculating the results of formulas
workbook.calculateFormula();
// Get the calculated value of the cell
const value = worksheet.cells.get("A4").value.toString();
// Saving the Excel file
const outputData = workbook.save(SaveFormat.Excel97To2003);
const blob = new Blob([outputData]);
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'output.xls';
downloadLink.style.display = 'block';
downloadLink.textContent = 'Download Excel File';
document.getElementById('result').innerHTML = `<p style="color: green;">Operation completed successfully! Calculated value in A4: ${value}. Click the download link to get the file.</p>`;
});
</script>
</html>
Important to Know for Formulas
Direct Calculation of Formula
Aspose.Cells has an embedded formula calculation engine. As well as calculating formulas imported from a designer file, Aspose.Cells can calculate formula results directly.
Sometimes, you need to calculate formula results directly without adding them into a worksheet. The values of the cells used in the formula already exist in a worksheet, and all you need is to find the result of those values based on some Microsoft Excel formula without adding the formula in a worksheet.
You can use Aspose.Cells' formula calculation engine APIs for Worksheet to calculateFormula(string, FormulaParseOptions, CalculationOptions, number, number, CalculationData) the results of such formulas without adding them to the worksheet:
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells Example - Calculate Sum</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat } = 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').addEventListener('click', async () => {
const fileInput = document.getElementById('fileInput');
// Create or load workbook
let workbook;
if (fileInput.files && fileInput.files.length > 0) {
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
workbook = new Workbook(new Uint8Array(arrayBuffer));
} else {
workbook = new Workbook();
}
// Access first worksheet
const worksheet = workbook.worksheets.get(0);
// Put 20 in cell A1
const cellA1 = worksheet.cells.get("A1");
cellA1.value = 20;
// Put 30 in cell A2
const cellA2 = worksheet.cells.get("A2");
cellA2.value = 30;
// Calculate the Sum of A1 and A2
const results = worksheet.calculateFormula("=Sum(A1:A2)");
// Prepare output text
const outputHtml = [
`<p>Value of A1: ${cellA1.stringValue}</p>`,
`<p>Value of A2: ${cellA2.stringValue}</p>`,
`<p>Result of Sum(A1:A2): ${results.toString()}</p>`
].join("");
// Save the workbook to a downloadable file
const outputData = workbook.save(SaveFormat.Xlsx);
const blob = new Blob([outputData], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'output.xlsx';
downloadLink.style.display = 'block';
downloadLink.textContent = 'Download Excel File';
document.getElementById('result').innerHTML = `<div style="color: green;">Operation completed successfully!</div>${outputHtml}`;
});
</script>
</body>
</html>
Above code produces the following output:
Value of A1: 20
Value of A2: 30
Result of Sum(A1:A2): 50.0
How to Calculate Formulas repeatedly
When there are lots of formulas in the workbook, and the user needs to calculate them repeatedly while modifying only a small part of them, it may be helpful for performance to enable the formula calculation chain: formulaSettings.enableCalculationChain.
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example - Calculate Formulas</title>
</head>
<body>
<h1>Calculate Formulas Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">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, Worksheet, Cell } = 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').addEventListener('click', async () => {
const fileInput = document.getElementById('fileInput');
if (!fileInput.files.length) {
document.getElementById('result').innerHTML = '<p style="color: red;">Please select an Excel file.</p>';
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Instantiating a Workbook object from the uploaded file
const workbook = new Workbook(new Uint8Array(arrayBuffer));
// Print the time before formula calculation
console.log(new Date());
// Set the CreateCalcChain as true
workbook.settings.formulaSettings.enableCalculationChain = true;
// Calculate the workbook formulas
workbook.calculateFormula();
// Print the time after formula calculation
console.log(new Date());
// Change the value of one cell (A1 in first worksheet)
const worksheet = workbook.worksheets.get(0);
const cell = worksheet.cells.get("A1");
cell.value = "newvalue";
// Re-calculate those formulas which depend on cell A1
workbook.calculateFormula();
// Save the modified workbook and provide download link
const outputData = workbook.save(SaveFormat.Excel97To2003);
const blob = new Blob([outputData]);
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'output.out.xls';
downloadLink.style.display = 'block';
downloadLink.textContent = 'Download Modified Excel File';
document.getElementById('result').innerHTML = '<p style="color: green;">Formulas calculated and cell updated successfully! Click the download link to get the modified file.</p>';
});
</script>
</html>
Important to Know
Advance topics
- Add Cells to Microsoft Excel Formula Watch Window
- Calculating IFNA function using Aspose.Cells
- Calculation of Array Formula of Data Tables
- Calculation of Excel 2016 MINIFS and MAXIFS functions
- Decrease the Calculation Time of Cell.calculate method
- Detecting Circular Reference
- Direct calculation of custom function without writing it in a worksheet
- Implement Custom Calculation Engine to extend the Default Calculation Engine of Aspose.Cells
- Interrupt or Cancel the Formula Calculation of Workbook
- Returning a Range of Values using AbstractCalculationEngine
- Setting Formula Calculation Mode of Workbook
- Using FormulaText function in Aspose.Cells