| using System; | |
| using System.Collections.Generic; | |
| using System.IO; | |
| using System.Linq; | |
| using System.Text; | |
| using OfficeOpenXml; | |
| using OfficeOpenXml.FormulaParsing; | |
| using OfficeOpenXml.FormulaParsing.Excel.Functions; | |
| using OfficeOpenXml.FormulaParsing.ExpressionGraph; | |
| using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; | |
| namespace EPPlusSamples | |
| { | |
| /// <summary> | |
| /// This sample shows how to add functions to the FormulaParser of EPPlus. | |
| /// | |
| /// For further details on how to build functions, have a look in the EPPlus.FormulaParsing.Excel.Functions namespace | |
| /// </summary> | |
| class Sample_AddFormulaFunction | |
| { | |
| public static void RunSample_AddFormulaFunction() | |
| { | |
| using (var package = new ExcelPackage(new MemoryStream())) | |
| { | |
| // add your function module to the parser | |
| package.Workbook.FormulaParserManager.LoadFunctionModule(new MyFunctionModule()); | |
| // Note that if you dont want to write a module, you can also | |
| // add new functions to the parser this way: | |
| // package.Workbook.FormulaParserManager.AddOrReplaceFunction("sum.addtwo", new SumAddTwo());- | |
| // package.Workbook.FormulaParserManager.AddOrReplaceFunction("seanconneryfy", new SeanConneryfy()); | |
| //Override the buildin Text function to handle swedish date formatting strings. Excel has localized date format strings with is now supported by EPPlus. | |
| package.Workbook.FormulaParserManager.AddOrReplaceFunction("text", new TextSwedish()); | |
| // add a worksheet with some dummy data | |
| var ws = package.Workbook.Worksheets.Add("Test"); | |
| ws.Cells["A1"].Value = 1; | |
| ws.Cells["A2"].Value = 2; | |
| ws.Cells["P3"].Formula = "SUM(A1:A2)"; | |
| ws.Cells["B1"].Value = "Hello"; | |
| ws.Cells["C1"].Value = new DateTime(2013,12,31); | |
| ws.Cells["C2"].Formula="Text(C1,\"åååå-MM-dd\")"; //Swedish formatting | |
| // use the added "sum.addtwo" function | |
| ws.Cells["A4"].Formula = "SUM.ADDTWO(A1:A2,P3)"; | |
| // use the other function "seanconneryfy" | |
| ws.Cells["B2"].Formula = "seanconneryfy(B1)"; | |
| // calculate | |
| ws.Calculate(); | |
| // show result | |
| Console.WriteLine("sum.addtwo(A1:A2,P3) evaluated to {0}", ws.Cells["A4"].Value); | |
| Console.WriteLine("seanconneryfy(B1) evaluated to {0}", ws.Cells["B2"].Value); | |
| } | |
| } | |
| } | |
| class MyFunctionModule : IFunctionModule | |
| { | |
| public MyFunctionModule() | |
| { | |
| Functions = new Dictionary<string, ExcelFunction>() | |
| { | |
| {"sum.addtwo", new SumAddTwo()}, | |
| {"seanconneryfy", new SeanConneryfy()} | |
| }; | |
| } | |
| public IDictionary<string, ExcelFunction> Functions { get; private set; } | |
| } | |
| /// <summary> | |
| /// A really unnecessary function. Adds two to all numbers in the supplied range and calculates the sum. | |
| /// </summary> | |
| class SumAddTwo : ExcelFunction | |
| { | |
| public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) | |
| { | |
| // Sanity check, will set excel VALUE error if min length is not met | |
| ValidateArguments(arguments, 1); | |
| // Helper method that converts function arguments to an enumerable of doubles | |
| var numbers = ArgsToDoubleEnumerable(arguments, context); | |
| // Do the work | |
| var result = 0d; | |
| numbers.ToList().ForEach(x => result += (x + 2)); | |
| // return the result | |
| return CreateResult(result, DataType.Decimal); | |
| } | |
| } | |
| /// <summary> | |
| /// This function handles Swedish formatting strings. | |
| /// </summary> | |
| class TextSwedish : ExcelFunction | |
| { | |
| public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) | |
| { | |
| // Sanity check, will set excel VALUE error if min length is not met | |
| ValidateArguments(arguments, 2); | |
| //Replace swedish year format with invariant for parameter 2. | |
| var format = arguments.ElementAt(1).Value.ToString().Replace("åååå", "yyyy"); | |
| var newArgs = new List<FunctionArgument> { arguments.ElementAt(0) }; | |
| newArgs.Add(new FunctionArgument(format)); | |
| //Use the build-in Text function. | |
| var func = new Text(); | |
| return func.Execute(newArgs, context); | |
| } | |
| } | |
| /// <summary> | |
| /// An even more unnecessary function, inspired by the Sean Connery keyboard;) Will add 'sh' at the end of the supplied string. | |
| /// </summary> | |
| class SeanConneryfy : ExcelFunction | |
| { | |
| public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) | |
| { | |
| // Sanity check, will set excel VALUE error if min length is not met | |
| ValidateArguments(arguments, 1); | |
| // Get the first arg | |
| var input = ArgToString(arguments, 0); | |
| // return the result | |
| return CreateResult(input + "sh", DataType.String); | |
| } | |
| } | |
| } |