using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; namespace OfficeOpenXml.FormulaParsing.Logging { internal class TextFileLogger : IFormulaParserLogger { private StreamWriter _sw; private const string Separator = "================================="; private int _count; private DateTime _startTime = DateTime.Now; private Dictionary _funcs = new Dictionary(); private Dictionary _funcPerformance = new Dictionary(); internal TextFileLogger(FileInfo fileInfo) { _sw = new StreamWriter(fileInfo.FullName); } private void WriteSeparatorAndTimeStamp() { _sw.WriteLine(Separator); _sw.WriteLine("Timestamp: {0}", DateTime.Now); _sw.WriteLine(); } private void WriteAddressInfo(ParsingContext context) { if (context.Scopes.Current != null && context.Scopes.Current.Address != null) { _sw.WriteLine("Worksheet: {0}", context.Scopes.Current.Address.Worksheet ?? ""); _sw.WriteLine("Address: {0}", context.Scopes.Current.Address.Address ?? ""); } } public void Log(ParsingContext context, Exception ex) { WriteSeparatorAndTimeStamp(); WriteAddressInfo(context); _sw.WriteLine(ex); _sw.WriteLine(); } public void Log(ParsingContext context, string message) { WriteSeparatorAndTimeStamp(); WriteAddressInfo(context); _sw.WriteLine(message); _sw.WriteLine(); } public void Log(string message) { WriteSeparatorAndTimeStamp(); _sw.WriteLine(message); _sw.WriteLine(); } public void LogCellCounted() { _count++; if (_count%500 == 0) { _sw.WriteLine(Separator); var timeEllapsed = DateTime.Now.Subtract(_startTime); _sw.WriteLine("{0} cells parsed, time {1} seconds", _count, timeEllapsed.TotalSeconds); var funcs = _funcs.Keys.OrderByDescending(x => _funcs[x]).ToList(); foreach (var func in funcs) { _sw.Write(func + " - " + _funcs[func]); if (_funcPerformance.ContainsKey(func)) { _sw.Write(" - avg: " + _funcPerformance[func]/_funcs[func] + " milliseconds"); } _sw.WriteLine(); } _sw.WriteLine(); _funcs.Clear(); } } public void LogFunction(string func) { if (!_funcs.ContainsKey(func)) { _funcs.Add(func, 0); } _funcs[func]++; } public void LogFunction(string func, long milliseconds) { if (!_funcPerformance.ContainsKey(func)) { _funcPerformance[func] = 0; } _funcPerformance[func] += milliseconds; } public void Dispose() { _sw.Close(); _sw.Dispose(); } } }