| 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<string, int> _funcs = new Dictionary<string, int>(); |
| private Dictionary<string, long> _funcPerformance = new Dictionary<string, long>(); |
| 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 ?? "<not specified>"); |
| _sw.WriteLine("Address: {0}", context.Scopes.Current.Address.Address ?? "<not available>"); |
| } |
| } |
| |
| 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(); |
| } |
| } |
| } |