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