| 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); | 
 |         } | 
 |     } | 
 | } |