The spreadsheet widget supports array formulas with a manual Ctrl-Shift-Enter. (see bottom of https://docs.telerik.com/kendo-ui/controls/data-management/spreadsheet/end-user/list-of-formulas)
I want to do the same programmatically using the Spreadsheet.Model classes.
This example shows how I can set and get results of a simple calculation, however the array formula I want to use is an Error.
Indeed, the Sample.xlsx it creates, when opened shows #N/A where the array formula is. However, in Excel, when I edit the cell and do Ctrl-Shift-Enter, it is interpreted as an array formula and shows the proper result. The same formula in the spreadsheet widget also works (kudos to the dev team -- array formulas can make you squirrely).
console output
StartingB2 retrieved 1B3 retrieved 10b4FormulaCell: =B2+B3b4Result.RawValue: 11k9CellValue: Telerik.Windows.Documents.Spreadsheet.Model.RangePropertyValue`1[Telerik.Windows.Documents.Spreadsheet.Model.ICellValue]k9FormulaCell: Telerik.Windows.Documents.Spreadsheet.Model.FormulaCellValuek9FormulaCell.RawValue: =MATCH(MIN(ABS(K2:K4-K8)),ABS(K2:K4-K8),0)k9FormulaCell.ResultValueType: ErrorFinished
program
using System;using System.IO;using Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx;using Telerik.Windows.Documents.Spreadsheet.Model;namespace ConsoleApp1{ class Program { static void Main(string[] args) { Console.WriteLine("Starting"); var workbook = new Workbook(); var sheet = workbook.Worksheets.Add(); // B2 var b2 = sheet.Cells[1, 1]; b2.SetValue(1); var b2CellValue = b2.GetValue(); var b2NumCell = b2CellValue.Value as NumberCellValue; var b2Num = b2NumCell.Value; Console.WriteLine($"B2 retrieved {b2Num}"); // B3 var b3 = sheet.Cells[2, 1]; b3.SetValue(10); var b3CellValue = b3.GetValue(); var b3NumCell = b3CellValue.Value as NumberCellValue; var b3Num = b3NumCell.Value; Console.WriteLine($"B3 retrieved {b3Num}"); // B4 = B2 + B3 var b4 = sheet.Cells[3, 1]; b4.SetValue("=B2+B3"); var b4CellValue = b4.GetValue(); var b4FormulaCell = b4CellValue.Value as FormulaCellValue; var b4Result = b4FormulaCell.GetResultValueAsCellValue(); Console.WriteLine($"b4FormulaCell: {b4FormulaCell.RawValue}"); Console.WriteLine($"b4Result.RawValue: {b4Result.RawValue}"); sheet.Cells[1, 10].SetValue(6); // K2 sheet.Cells[2, 10].SetValue(7); // K3 sheet.Cells[3, 10].SetValue(8); // K4 sheet.Cells[4, 10].SetValue(100); // K5 sheet.Cells[5, 10].SetValue(1000); // K6 sheet.Cells[6, 10].SetValue(10000); // K7 sheet.Cells[7, 10].SetValue(7.1); // K8 // https://www.extendoffice.com/documents/excel/1050-excel-find-closest-value.html
// goal use MATCH look up to find index of value in K2:K4 nearest to K8
var arrayDiff = "ABS(K2:K4-K8)"; // formula for computing nearness var matchFormula = $"=MATCH(MIN({arrayDiff}),{arrayDiff},0)"; // formula for computing index of nearest (smallest ABS diff) sheet.Cells[8, 10].SetValue(matchFormula); // K9, nearest index for 7.1 should be computed as 2, which corresponds to value of 7 in K3, which is the second item in K2:K4 var k9 = sheet.Cells[8, 10]; var k9CellValue = k9.GetValue(); var k9FormulaCell = k9CellValue.Value as FormulaCellValue; // var k9Result = k9FormulaCell.GetResultValueAsCellValue(); Console.WriteLine($"k9CellValue: {k9CellValue}"); Console.WriteLine($"k9FormulaCell: {k9FormulaCell}"); Console.WriteLine($"k9FormulaCell.RawValue: {k9FormulaCell.RawValue}"); Console.WriteLine($"k9FormulaCell.ResultValueType: {k9FormulaCell.ResultValueType}"); // Console.WriteLine($"k9Result.RawValue: {k9Result.RawValue}"); using (var output = new FileStream(@"C:\Temp\Sample.xlsx", FileMode.Create)) { new XlsxFormatProvider().Export(workbook, output); } Console.WriteLine("Finished"); } }}