public bool CompareWithXML(ExcelCell actual)
 {
     return(CellComparator.CompareCellsXML(Value, actual.Value, Format));
 }
        public bool CompareExcelReport(string actualPath)
        {
            Excel.Application app            = null;
            Excel.Workbook    goldenCopy     = null;
            Excel.Workbook    actualWorkbook = null;
            var errorList = ExcelComparator.CompareExcelDataTable(goldenCopyPath, actualPath);

            try
            {
                app = new Excel.Application
                {
                    DisplayAlerts  = false,
                    ScreenUpdating = false
                };
                goldenCopy  = app.Workbooks.Open(goldenCopyPath, Notify: false);
                commentList = new List <CellComment>();
                result      = true;

                //Open files to compare
                actualWorkbook = app.Workbooks.Open(actualPath, Notify: false);
                foreach (Excel.Worksheet expectedWS in goldenCopy.Worksheets)
                {
                    // Discard Hidden tabs
                    if (!expectedWS.Visible.Equals(Excel.XlSheetVisibility.xlSheetVisible))
                    {
                        continue;
                    }
                    Excel.Worksheet actualWS = null;
                    try
                    {
                        actualWS = actualWorkbook.Worksheets[expectedWS.Name];
                        var worksheetErrorCells = errorList[expectedWS.Name];
                        LogHelpers.Write("Starting Review of potential errors sheet: " + expectedWS.Name);
                        // Find the last real row and column that has a value.
                        Stopwatch stopWatch = new Stopwatch();
                        stopWatch.Start();
                        //Checks that cells matches
                        int total = worksheetErrorCells.Count;
                        int perc  = 0;
                        error = 0;
                        foreach (var cell in worksheetErrorCells)
                        {
                            int       i        = cell.Item1;
                            int       j        = cell.Item2;
                            ExcelCell expected = new ExcelCell(expectedWS.Cells[i, j]);
                            ExcelCell actual   = new ExcelCell(actualWS.Cells[i, j]);
                            if (!CellsAreEqual(expected, actual))
                            {
                                actualWS.MarkCellAsError(i, j);
                                ComparatorError(i, j, expected.GetValueWithFormat(), actual.GetValueWithFormat());
                            }
                            perc++;
                        }
                        // Add error cell comments
                        foreach (CellComment c in commentList)
                        {
                            if (c.text != null)
                            {
                                actualWS.Cells[c.row, c.col].AddComment(c.text);
                            }
                        }
                        commentList.Clear();
                        if (total != 0)
                        {
                            LogHelpers.Write("Completed review: " + (perc * 100 / total) + "% " + perc + "/" + total + " Errors found:" + error + " Elapsed Time: " + stopWatch.Elapsed.TotalSeconds);
                        }
                        else
                        {
                            LogHelpers.Write("Completed review: no potential errors found");
                        }
                    }
                    catch (COMException)
                    {
                        // The whole sheet is missing,  i add it to the actual result and marked as diff.
                        LogHelpers.Write("Missing Worksheet " + expectedWS.Name);
                        Excel.Worksheet missingWS = actualWorkbook.Worksheets.Add();
                        missingWS.Name      = expectedWS.Name;
                        missingWS.Tab.Color = Excel.XlRgbColor.rgbRed;
                        missingWS.MarkCellAsError(1, 1);
                        result = false;
                    }
                    finally
                    {
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        Marshal.ReleaseComObject(expectedWS);
                        if (actualWS != null)
                        {
                            Marshal.ReleaseComObject(actualWS);
                        }
                    }
                }
                //Close workbooks
                if (!result)
                {
                    string fileName = string.Format("Result_{0}_{1}", DateTime.Now.Add(default).ToString("MM-dd-yyyy_HHmmss", new CultureInfo("en-US")), actualWorkbook.Name);