| using System; | 
 | using System.Globalization; | 
 | using System.Text; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using Microsoft.VisualStudio.TestTools.UnitTesting; | 
 | using OfficeOpenXml; | 
 | using System.IO; | 
 | using System.Diagnostics; | 
 | using OfficeOpenXml.FormulaParsing; | 
 |  | 
 | namespace EPPlusTest | 
 | { | 
 |     [DeploymentItem("Workbooks", "targetFolder")] | 
 |     [TestClass] | 
 |     public class Calculation | 
 |     { | 
 |         //[TestMethod] | 
 |         //public void Calulation() | 
 |         //{ | 
 |         //    var pck = new ExcelPackage(new FileInfo("c:\\temp\\chain.xlsx")); | 
 |         //    pck.Workbook.Calculate(); | 
 |         //    Assert.AreEqual(50D, pck.Workbook.Worksheets[1].Cells["C1"].Value); | 
 |         //} | 
 |         //[TestMethod] | 
 |         //public void Calulation2() | 
 |         //{ | 
 |         //    var pck = new ExcelPackage(new FileInfo("c:\\temp\\chainTest.xlsx")); | 
 |         //    pck.Workbook.Calculate(); | 
 |         //    Assert.AreEqual(1124999960382D, pck.Workbook.Worksheets[1].Cells["C1"].Value); | 
 |         //} | 
 |         //[TestMethod] | 
 |         //public void Calulation3() | 
 |         //{ | 
 |         //    var pck = new ExcelPackage(new FileInfo("c:\\temp\\names.xlsx")); | 
 |         //    pck.Workbook.Calculate(); | 
 |         //    //Assert.AreEqual(1124999960382D, pck.Workbook.Worksheets[1].Cells["C1"].Value); | 
 |         //} | 
 |         [TestMethod] | 
 |         public void CalulationTestDatatypes() | 
 |         { | 
 |             var pck = new ExcelPackage(); | 
 |             var ws=pck.Workbook.Worksheets.Add("Calc1"); | 
 |             ws.SetValue("A1", (short)1); | 
 |             ws.SetValue("A2", (long)2); | 
 |             ws.SetValue("A3", (Single)3); | 
 |             ws.SetValue("A4", (double)4); | 
 |             ws.SetValue("A5", (Decimal)5); | 
 |             ws.SetValue("A6", (byte)6); | 
 |             ws.SetValue("A7", null); | 
 |             ws.Cells["A10"].Formula = "Sum(A1:A8)"; | 
 |             ws.Cells["A11"].Formula = "SubTotal(9,A1:A8)"; | 
 |             ws.Cells["A12"].Formula = "Average(A1:A8)"; | 
 |  | 
 |             ws.Calculate(); | 
 |             Assert.AreEqual(21D, ws.Cells["a10"].Value); | 
 |             Assert.AreEqual(21D, ws.Cells["a11"].Value); | 
 |             Assert.AreEqual(21D/6, ws.Cells["a12"].Value); | 
 |         } | 
 |         [TestMethod] | 
 |         public void CalculateTest() | 
 |         { | 
 |             var pck = new ExcelPackage(); | 
 |             var ws = pck.Workbook.Worksheets.Add("Calc1"); | 
 |  | 
 |             ws.SetValue("A1",( short)1); | 
 |             var v=ws.Calculate("2.5-A1+ABS(-3.0)-SIN(3)"); | 
 |             Assert.AreEqual(4.3589, Math.Round((double)v, 4)); | 
 |                          | 
 |             ws.Row(1).Hidden = true; | 
 |             v = ws.Calculate("subtotal(109,a1:a10)"); | 
 |             Assert.AreEqual(0D, v); | 
 |  | 
 |             v = ws.Calculate("-subtotal(9,a1:a3)"); | 
 |             Assert.AreEqual(-1D, v); | 
 |         } | 
 |         [TestMethod] | 
 |         public void CalculateTestIsFunctions() | 
 |         { | 
 |             var pck = new ExcelPackage(); | 
 |             var ws = pck.Workbook.Worksheets.Add("Calc1"); | 
 |  | 
 |             ws.SetValue(1, 1, 1.0D); | 
 |             ws.SetFormula(1, 2, "isblank(A1:A5)"); | 
 |             ws.SetFormula(1, 3, "concatenate(a1,a2,a3)"); | 
 |             ws.SetFormula(1, 4, "Row()"); | 
 |             ws.SetFormula(1, 5, "Row(a3)"); | 
 |             ws.Calculate(); | 
 |         } | 
 |         [Ignore] | 
 |         [TestMethod] | 
 |         public void Calulation4() | 
 |         { | 
 |             //C:\Development\epplus formulas\EPPlusTest\Workbooks\FormulaTest.xlsx | 
 |             var pck = new ExcelPackage(new FileInfo(@"C:\Development\epplus formulas\EPPlusTest\Workbooks\FormulaTest.xlsx")); | 
 |             //var pck = new ExcelPackage(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "..\\..\\..\\..\\EPPlusTest\\workbooks\\FormulaTest.xlsx")); | 
 |             pck.Workbook.Calculate(); | 
 |             Assert.AreEqual(490D, pck.Workbook.Worksheets[1].Cells["D5"].Value); | 
 |         } | 
 |         [Ignore] | 
 |         [TestMethod] | 
 |         public void CalulationValidationExcel() | 
 |         { | 
 |             var dir = AppDomain.CurrentDomain.BaseDirectory; | 
 |             var pck = new ExcelPackage(new FileInfo(Path.Combine(dir, "Workbooks", "FormulaTest.xlsx"))); | 
 |  | 
 |             var ws = pck.Workbook.Worksheets["ValidateFormulas"]; | 
 |             var fr = new Dictionary<string, object>(); | 
 |             foreach (var cell in ws.Cells) | 
 |             { | 
 |                 if (!string.IsNullOrEmpty(cell.Formula)) | 
 |                 { | 
 |                     fr.Add(cell.Address, cell.Value); | 
 |                 } | 
 |             } | 
 |             pck.Workbook.Calculate(); | 
 |             var nErrors = 0; | 
 |             var errors = new List<Tuple<string, object, object>>(); | 
 |             foreach (var adr in fr.Keys) | 
 |             { | 
 |                 try | 
 |                 { | 
 |                     if (fr[adr] is double && ws.Cells[adr].Value is double) | 
 |                     { | 
 |                         var d1 = Convert.ToDouble(fr[adr]); | 
 |                         var d2 = Convert.ToDouble(ws.Cells[adr].Value); | 
 |                         if (Math.Abs(d1 - d2) < 0.0001) | 
 |                         { | 
 |                             continue; | 
 |                         } | 
 |                         else | 
 |                         { | 
 |                             Assert.AreEqual(fr[adr], ws.Cells[adr].Value); | 
 |                         } | 
 |                     } | 
 |                     else | 
 |                     { | 
 |                         Assert.AreEqual(fr[adr], ws.Cells[adr].Value); | 
 |                     } | 
 |                 } | 
 |                 catch | 
 |                 { | 
 |                     errors.Add(new Tuple<string, object, object>(adr, fr[adr], ws.Cells[adr].Value)); | 
 |                     nErrors++; | 
 |                 } | 
 |             } | 
 |         } | 
 |         [Ignore] | 
 |         [TestMethod] | 
 |         public void TestOneCell() | 
 |         { | 
 |             var pck = new ExcelPackage(new FileInfo(@"C:\temp\EPPlusTestark\Test4.xlsm")); | 
 |             var ws = pck.Workbook.Worksheets.First();  | 
 |             pck.Workbook.Worksheets["Räntebärande formaterat utland"].Cells["M13"].Calculate(); | 
 |             Assert.AreEqual(0d, pck.Workbook.Worksheets["Räntebärande formaterat utland"].Cells["M13"].Value);   | 
 |         } | 
 |  | 
 |         [Ignore] | 
 |         [TestMethod] | 
 |         public void TestPrecedence() | 
 |         { | 
 |             var pck = new ExcelPackage(new FileInfo(@"C:\temp\EPPlusTestark\Precedence.xlsx")); | 
 |             var ws = pck.Workbook.Worksheets.Last(); | 
 |             pck.Workbook.Calculate(); | 
 |             Assert.AreEqual(150d, ws.Cells["A1"].Value); | 
 |         } | 
 |         [Ignore] | 
 |         [TestMethod] | 
 |         public void TestDataType() | 
 |         { | 
 |             var pck = new ExcelPackage(new FileInfo(@"c:\temp\EPPlusTestark\calc_amount.xlsx")); | 
 |             var ws = pck.Workbook.Worksheets[1]; | 
 |             //ws.Names.Add("Name1",ws.Cells["A1"]); | 
 |             //ws.Names.Add("Name2", ws.Cells["A2"]); | 
 |             ws.Names["PRICE"].Value = 30; | 
 |             ws.Names["QUANTITY"].Value = 10; | 
 |  | 
 |             ws.Calculate(); | 
 |  | 
 |             ws.Names["PRICE"].Value = 40; | 
 |             ws.Names["QUANTITY"].Value = 20; | 
 |  | 
 |             ws.Calculate(); | 
 |         } | 
 |         [TestMethod] | 
 |         public void CalcTwiceError() | 
 |         { | 
 |             var pck = new ExcelPackage(); | 
 |             var ws = pck.Workbook.Worksheets.Add("CalcTest"); | 
 |             ws.Names.AddValue("PRICE", 10); | 
 |             ws.Names.AddValue("QUANTITY", 11); | 
 |             ws.Cells["A1"].Formula="PRICE*QUANTITY"; | 
 |             ws.Names.AddFormula("AMOUNT", "PRICE*QUANTITY"); | 
 |  | 
 |             ws.Names["PRICE"].Value = 30; | 
 |             ws.Names["QUANTITY"].Value = 10; | 
 |  | 
 |             ws.Calculate(); | 
 |             Assert.AreEqual(300D, ws.Cells["A1"].Value); | 
 |             Assert.AreEqual(300D, ws.Names["AMOUNT"].Value); | 
 |             ws.Names["PRICE"].Value = 40; | 
 |             ws.Names["QUANTITY"].Value = 20; | 
 |  | 
 |             ws.Calculate(); | 
 |             Assert.AreEqual(800D, ws.Cells["A1"].Value); | 
 |             Assert.AreEqual(800D, ws.Names["AMOUNT"].Value); | 
 |         } | 
 |         [TestMethod] | 
 |         public void IfError() | 
 |         { | 
 |             var pck = new ExcelPackage(); | 
 |             var ws = pck.Workbook.Worksheets.Add("CalcTest"); | 
 |             ws.Cells["A1"].Value = "test1"; | 
 |             ws.Cells["A5"].Value = "test2"; | 
 |             ws.Cells["A2"].Value = "Sant"; | 
 |             ws.Cells["A3"].Value = "Falskt"; | 
 |             ws.Cells["A4"].Formula = "if(A1>=A5,true,A3)"; | 
 |             ws.Cells["B1"].Formula = "isText(a1)"; | 
 |             ws.Cells["B2"].Formula = "isText(\"Test\")"; | 
 |             ws.Cells["B3"].Formula = "isText(1)"; | 
 |             ws.Cells["B4"].Formula = "isText(true)"; | 
 |             ws.Cells["c1"].Formula = "mid(a1,4,15)"; | 
 |  | 
 |             ws.Calculate(); | 
 |         } | 
 |         [TestMethod, Ignore] | 
 |         public void TestAllWorkbooks() | 
 |         { | 
 |             StringBuilder sb=new StringBuilder(); | 
 |             //Add sheets to test in this directory or change it to your testpath. | 
 |             string path = @"C:\temp\EPPlusTestark\workbooks"; | 
 |             if(!Directory.Exists(path)) return; | 
 |  | 
 |             foreach (var file in Directory.GetFiles(path, "*.xls*")) | 
 |             { | 
 |                 sb.Append(GetOutput(file)); | 
 |             } | 
 |  | 
 |             if (sb.Length > 0) | 
 |             { | 
 |                 File.WriteAllText(string.Format("TestAllWorkooks{0}.txt", DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortDateString()), sb.ToString()); | 
 |                 throw(new Exception("Test failed with\r\n\r\n" + sb.ToString())); | 
 |  | 
 |             } | 
 |         }         | 
 |         private string GetOutput(string file) | 
 |         { | 
 |             using (var pck = new ExcelPackage(new FileInfo(file))) | 
 |             { | 
 |                 var fr = new Dictionary<string, object>(); | 
 |                 foreach (var ws in pck.Workbook.Worksheets) | 
 |                 { | 
 |                     if (!(ws is ExcelChartsheet)) | 
 |                     { | 
 |                         foreach (var cell in ws.Cells) | 
 |                         { | 
 |                             if (!string.IsNullOrEmpty(cell.Formula)) | 
 |                             { | 
 |                                 fr.Add(ws.PositionID.ToString() + "," + cell.Address, cell.Value); | 
 |                                 ws._values.SetValue(cell.Start.Row, cell.Start.Column, null); | 
 |                             } | 
 |                         } | 
 |                     } | 
 |                 } | 
 |  | 
 |                 pck.Workbook.Calculate(); | 
 |                 var nErrors = 0; | 
 |                 var errors = new List<Tuple<string, object, object>>(); | 
 |                 ExcelWorksheet sheet=null; | 
 |                 string adr=""; | 
 |                 var fileErr = new System.IO.StreamWriter("c:\\temp\\err.txt"); | 
 |                 foreach (var cell in fr.Keys) | 
 |                 { | 
 |                     try | 
 |                     { | 
 |                         var spl = cell.Split(','); | 
 |                         var ix = int.Parse(spl[0]); | 
 |                         sheet = pck.Workbook.Worksheets[ix]; | 
 |                         adr = spl[1]; | 
 |                         if (fr[cell] is double && (sheet.Cells[adr].Value is double || sheet.Cells[adr].Value is decimal  || sheet.Cells[adr].Value.GetType().IsPrimitive)) | 
 |                         { | 
 |                             var d1 = Convert.ToDouble(fr[cell]); | 
 |                             var d2 = Convert.ToDouble(sheet.Cells[adr].Value); | 
 |                             //if (Math.Abs(d1 - d2) < double.Epsilon) | 
 |                             if(double.Equals(d1,d2)) | 
 |                             { | 
 |                                 continue; | 
 |                             } | 
 |                             else | 
 |                             { | 
 |                                 //errors.Add(new Tuple<string, object, object>(adr, fr[cell], sheet.Cells[adr].Value)); | 
 |                                 fileErr.WriteLine("Diff cell " + sheet.Name + "!" + adr +"\t" + d1.ToString("R15") + "\t" + d2.ToString("R15")); | 
 |                             } | 
 |                         } | 
 |                         else | 
 |                         { | 
 |                             if ((fr[cell]??"").ToString() != (sheet.Cells[adr].Value??"").ToString()) | 
 |                             { | 
 |                                 fileErr.WriteLine("String?  cell " + sheet.Name + "!" + adr + "\t" + (fr[cell] ?? "").ToString() + "\t" + (sheet.Cells[adr].Value??"").ToString()); | 
 |                             } | 
 |                             //errors.Add(new Tuple<string, object, object>(adr, fr[cell], sheet.Cells[adr].Value)); | 
 |                         } | 
 |                     } | 
 |                     catch (Exception e) | 
 |                     {                         | 
 |                         fileErr.WriteLine("Exception cell " + sheet.Name + "!" + adr + "\t" + fr[cell].ToString() + "\t" + sheet.Cells[adr].Value +  "\t" + e.Message); | 
 |                         fileErr.WriteLine("***************************"); | 
 |                         fileErr.WriteLine(e.ToString()); | 
 |                         nErrors++; | 
 |                     } | 
 |                 } | 
 |                 fileErr.Close(); | 
 |                 return nErrors.ToString(); | 
 |             } | 
 |         } | 
 |     } | 
 | } |