﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using OfficeOpenXml;

namespace EPPlusSamples
{
    class Sample_FormulaCalc
    {
        public static void RunSampleFormulaCalc()
        {
            using (var package = new ExcelPackage(new MemoryStream()))
            {
                var ws1 = package.Workbook.Worksheets.Add("ws1");
                // Add some values to sum
                ws1.Cells["A1"].Formula = "(2*2)/2";
                ws1.Cells["A2"].Value = 4;
                ws1.Cells["A3"].Value = 6;
                ws1.Cells["A4"].Formula = "SUM(A1:A3)";
                
                // calculate all formulas on  the worksheet
                ws1.Calculate();

                // Print the calculated value
                Console.WriteLine("SUM(A1:A3) evaluated to {0}", ws1.Cells["A4"].Value);

                // Add another worksheet
                var ws2 = package.Workbook.Worksheets.Add("ws2");
                ws2.Cells["A1"].Value = 3;
                ws2.Cells["A2"].Formula = "SUM(A1,ws1!A4)";

                // calculate all formulas in the entire workbook
                package.Workbook.Calculate();

                // Print the calculated value
                Console.WriteLine("SUM(A1,ws1!A4) evaluated to {0}", ws2.Cells["A2"].Value);

                // Calculate a range
                ws1.Cells["B1"].Formula = "IF(TODAY()<DATE(2014,6,1),\"BEFORE\" &\" FIRST\",CONCATENATE(\"FIRST\",\" OF\",\" JUNE 2014 OR LATER\"))";
                ws1.Cells["B1"].Calculate();
                
                // Print the calculated value
                Console.WriteLine("IF(TODAY()<DATE(2014,6,1),\"BEFORE\" &\" FIRST\",CONCATENATE(\"FIRST\",\" OF\",\" JUNE 2014 OR LATER\")) evaluated to {0}", ws1.Cells["B1"].Value);

                // Evaluate a formula string (without calculate depending cells).
                // That means that if A1 contains a formula that hasn't been calculated it take the value from a1, blank or zero if it's a new formula.
                // In this case A1 has been calculated (2), so everything should be ok!
                const string formula = "(2+4)*ws1!A1";
                var result = package.Workbook.FormulaParserManager.Parse(formula);

                // Print the calculated value
                Console.WriteLine("(2+4)*ws1!A2 evaluated to {0}", result);

                // Evaluate a formula string (Calculate depending cells)
                // A1 will be recalculated.
                var result2 = ws1.Calculate("(2+4)*A1");
                
            }
        }
    }
}
