Add 'DisplayCalcChain' method to debug why the computation of the Calc Chain was taking so long during a 'regenerate'.
diff --git a/EPPlus/FormulaParsing/CalculateExtentions.cs b/EPPlus/FormulaParsing/CalculateExtentions.cs
index 1ec584a..22637ac 100644
--- a/EPPlus/FormulaParsing/CalculateExtentions.cs
+++ b/EPPlus/FormulaParsing/CalculateExtentions.cs
@@ -37,6 +37,7 @@
using System.Text;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Exceptions;
+using System.IO;
namespace OfficeOpenXml
{
public static class CalculationExtension
@@ -88,6 +89,11 @@
Init(worksheet.Workbook);
//worksheet.Workbook._formulaParser = null; TODO:Cant reset. Don't work with userdefined or overrided worksheet functions
var dc = DependencyChainFactory.Create(worksheet, options);
+
+ // Display Calc Chain to determine why formula calculation is taking so long.
+ // Uncomment the following line to display the Calc Chain.
+ // DisplayCalcChain(worksheet, dc);
+
var parser = worksheet.Workbook.FormulaParser;
parser.InitNewCalc();
if (parser.Logger != null)
@@ -97,6 +103,37 @@
}
CalcChain(worksheet.Workbook, parser, dc);
}
+
+ // I added this method in December 2019 to analyze why formula calculation was taking
+ // so long during a 'Regenerate' of a Microsoft Excel table.
+ private static void DisplayCalcChain(ExcelWorksheet worksheet, DependencyChain dc)
+ {
+ // Open Output file
+ string outputFolderName = @"C:\\EPPlus";
+ Directory.CreateDirectory(outputFolderName);
+ DateTime invocationDateTime = DateTime.Now;
+ string outputFileName = Path.Combine(outputFolderName, $"CalcChain_{worksheet.Name}_{invocationDateTime.ToString("yyyyMMdd_HHmmss_fff")}.txt");
+ FileStream fileStream = new FileStream(outputFileName, FileMode.CreateNew);
+ StreamWriter streamWriter = new System.IO.StreamWriter(fileStream, Encoding.UTF8, 65536);
+
+ // Display CalcChain
+ foreach (int index in dc.CalcOrder)
+ {
+ FormulaCell formulaCell = dc.list[index];
+ string calcChainValue = "";
+ calcChainValue += $"Index {index}, ";
+ calcChainValue += $"Worksheet '{formulaCell.ws.Name}', ";
+ calcChainValue += $"Row {formulaCell.Row}, ";
+ calcChainValue += $"Col {formulaCell.Column}, ";
+ calcChainValue += $" Formula '{formulaCell.Formula}'";
+ streamWriter.WriteLine(calcChainValue);
+ }
+
+ // Close Output file
+ streamWriter.Flush();
+ streamWriter.Close();
+ }
+
public static void Calculate(this ExcelRangeBase range)
{
Calculate(range, new ExcelCalculationOption());