private void UpdateTextBox(string message, bool newSection = false, bool error = false) { if (textBox == null) { return; } textBox.BeginInvoke((MethodInvoker) delegate { if (newSection) { textBox.AppendText("-------------------------------" + Environment.NewLine); } if (error) { textBox.AppendText("===== ВНИМАНИЕ! ОШИБКА! =====" + Environment.NewLine); } textBox.AppendText(DateTime.Now.ToString("HH:mm:ss") + ": " + message + Environment.NewLine); }); LoggingSystem.LogMessageToFile(message); }
private string[] SplitPhoneNumbers(string str) { string[] phoneNumbers = new string[2]; if (!str.Contains(" -> ")) { return(phoneNumbers); } try { phoneNumbers = str.Split(new[] { " -> " }, StringSplitOptions.None); int index = 0; foreach (string number in phoneNumbers) { string clearedToDigit = new string(number.Where(Char.IsDigit).ToArray()); if (clearedToDigit.Length >= 10) { clearedToDigit = clearedToDigit.Substring(clearedToDigit.Length - 10); } if (!clearedToDigit.StartsWith("9") && clearedToDigit.Length >= 7) { clearedToDigit = clearedToDigit.Substring(clearedToDigit.Length - 7); } phoneNumbers[index] = clearedToDigit; index++; } } catch (Exception e) { LoggingSystem.LogMessageToFile(e.Message); LoggingSystem.LogMessageToFile(e.StackTrace); UpdateTextBox("Не удалось разобрать номера телефонов: " + str); } return(phoneNumbers); }
public bool WriteToExcel() { try { UpdateTextBox("Запуск приложения MS Excel"); Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) { LoggingSystem.LogMessageToFile("Не удалось запустить MS Excel"); return(false); } xlApp.Visible = false; xlApp.EnableAnimations = false; xlApp.DisplayAlerts = false; float initialPercent = progressBar.Value; float oneFilePercentage = (90.0f - initialPercent) / (float)filesInfo.Count; string folderToSave = Path.Combine(AssemblyDirectory, "Results"); if (!Directory.Exists(folderToSave)) { Directory.CreateDirectory(folderToSave); } foreach (SpRecordFileInformation fileInformation in filesInfo.Values) { UpdateTextBox("Создание новой книги для: " + fileInformation.WorkstationName); string templateFile = Path.Combine(AssemblyDirectory, "Template.xlsx"); Workbook wb = xlApp.Workbooks.Open(templateFile); if (wb == null) { xlApp.Quit(); LoggingSystem.LogMessageToFile("Не удалось открыть книгу: " + templateFile); return(false); } //foreach(Worksheet sheet in wb.Sheets) { // if (sheet.Index != 1) // sheet.Delete(); //} Worksheet ws = (Worksheet)wb.Sheets[1]; if (ws == null) { xlApp.Quit(); LoggingSystem.LogMessageToFile("Не удалось создать Excel книгу"); return(false); } float oneLinePercent = oneFilePercentage / (float)fileInformation.DaysInfo.Count; int row = 3; foreach (KeyValuePair <DateTime, SpRecordFileInformation.DayInfo> dayInfo in fileInformation.DaysInfo) { UpdateTextBox("Запись данных: " + dayInfo.Key.ToShortDateString()); object[] values = new object[] { dayInfo.Key.ToShortDateString(), dayInfo.Value.TotalIncoming, dayInfo.Value.TotalMissed, dayInfo.Value.TotalIncoming > 0 ? (double)dayInfo.Value.TotalMissed / (double)dayInfo.Value.TotalIncoming : 0, dayInfo.Value.TotalRedirected, dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostSelf5sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostSelf10sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostSelf15sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostSelf20sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostSelf25sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostSelf30sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostRedirected5sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostRedirected10sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostRedirected15sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostRedirected20sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostRedirected25sec), dayInfo.Value.GetMissedCallCount(SpRecordFileInformation.DayInfo.MissedCallType.ConditionalyLostRedirected30sec), dayInfo.Value.TotalConditionalyLost, dayInfo.Value.TotalConditionalyLostPercent }; int column = 1; foreach (object value in values) { ws.Cells[row, column].Value = value; column++; } row++; initialPercent += oneLinePercent; UpdateProgressBar((int)initialPercent); } ws.Range["A3:S3"].Select(); xlApp.Selection.Copy(); ws.Range["A4:S" + row].Select(); xlApp.Selection.PasteSpecial(XlPasteType.xlPasteFormats, Microsoft.Office.Interop.Excel.Constants.xlNone, false, false); ws.Range["A1"].Select(); ws.Range["A" + row].Value = "Всего:"; string[] valuesTotal = new string[] { "=SUM(B3:B" + (row - 1) + ")", "=SUM(C3:C" + (row - 1) + ")", "=C" + row + "/B" + row, "=SUM(E3:E" + (row - 1) + ")", "=SUM(F3:F" + (row - 1) + ")", "=SUM(G3:G" + (row - 1) + ")", "=SUM(H3:H" + (row - 1) + ")", "=SUM(I3:I" + (row - 1) + ")", "=SUM(J3:J" + (row - 1) + ")", "=SUM(K3:K" + (row - 1) + ")", "=SUM(L3:L" + (row - 1) + ")", "=SUM(M3:M" + (row - 1) + ")", "=SUM(N3:N" + (row - 1) + ")", "=SUM(O3:O" + (row - 1) + ")", "=SUM(P3:P" + (row - 1) + ")", "=SUM(Q3:Q" + (row - 1) + ")", "=SUM(R3:R" + (row - 1) + ")", "=R" + row + "/B" + row }; int columnTotal = 2; foreach (string valueTotal in valuesTotal) { ws.Cells[row, columnTotal].Formula = valueTotal; columnTotal++; } ws.Range["A" + (row + 1)].Value = "Имя системы: " + fileInformation.WorkstationName; ws.Range["A" + row + ":S" + row].Borders.LineStyle = XlLineStyle.xlContinuous; ws.Range["A" + row + ":S" + row].BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium); string pathToSave = Path.Combine(folderToSave, "Анализ звонков - " + fileInformation.WorkstationName + " - " + DateTime.Now.ToString("yyyyMMdd hhmmss") + ".xlsx"); wb.SaveAs(pathToSave); UpdateTextBox("Книга с отчетом сохранена по адресу: " + pathToSave); LoggingSystem.LogMessageToFile("Анализ звонков сохранен в файл: " + pathToSave); wb.Close(SaveChanges: false); } //foreach(KeyValuePair<string, SpRecordFileInformation> fileInfo in filesInfo) { // List<List<string>> fileContent = fileInfo.Value.FileContent; // UpdateTextBox("Заполнение информации по файлу: " + fileInfo.Key); // float initialFilePercent = progressBar.Value; // float oneLinePercent = oneFilePercentage / fileContent.Count; // int rowToFill = 1; // foreach(List<string> line in fileContent) { // initialFilePercent += oneLinePercent; // UpdateProgressBar((int)initialFilePercent); // string columnName = GetExcelColumnName(line.Count); // ws.Range["A" + rowToFill + ":" + columnName + rowToFill].Value = line.ToArray(); // //line lenght = 9 - normal // // = 12 - missed // // = 11 - tied with missed // if (line.Count > 9) { // int colorIndex = 6; // if (line.Count == 11) // colorIndex = 35; // ws.Range["A" + rowToFill + ":" + columnName + rowToFill].Interior.ColorIndex = colorIndex; // } // rowToFill++; // } // ws.UsedRange.Columns.AutoFit(); // ws.Columns[1].ColumnWidth = 15; // wb.Worksheets.Add(After: ws); // ws = (Worksheet)wb.ActiveSheet; // initialPercent += oneFilePercentage; // UpdateProgressBar((int)initialPercent); //} //UpdateTextBox("Создание сводной таблицы по всем файлам"); //string firstColumnRange = "A5:A34"; //Dictionary<string, string> firstColumn = new Dictionary<string, string> { // {"Всего звонков", "A5:A6" }, // {"Принятые", "A7:A9" }, // {"Непринятые", "A10:A29" }, // {"Ошибочные" + Environment.NewLine + "непринятые", "A30:A33" }, // {"Набранные", "A34:A35" } //}; //foreach (KeyValuePair<string, string> item in firstColumn) { // try { // ws.Range[item.Value.Split(':')[0]].Value = item.Key; // ws.Range[item.Value].Merge(); // } catch (Exception e) { // LoggingSystem.LogMessageToFile(e.Message); // LoggingSystem.LogMessageToFile(e.StackTrace); // } //} //ws.Range[firstColumnRange].VerticalAlignment = XlHAlign.xlHAlignCenter; //ws.Range[firstColumnRange].HorizontalAlignment = XlVAlign.xlVAlignCenter; //ws.Range[firstColumnRange].Borders.LineStyle = XlLineStyle.xlDot; //ws.Range[firstColumnRange].BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium); //ws.Columns[1].ColumnWidth = 13; //string[] secondColumn = { // //header // "Имя файла", // "Имя рабочей станции", // "Дата создания", // "Отчетный период", // //total // "Количество", // "Общая длительность", // //accepted // "Количество", // "Общая длительность", // "Средняя длительность", // //missed // "Количество", // "Общая длительность", // "Средняя длительность", // "% от всех входящих", // "Регламент работы с непринятыми вызовами:" + Environment.NewLine + // "Первая попытка - не позднее " + Properties.Settings.Default.CallbackFirstAttemptMax + // " минут после непринятого вызова" + Environment.NewLine + // "Вторая попытка - от " + Properties.Settings.Default.CallbackFirstAttemptMax + // " до " + Properties.Settings.Default.CallbackSecondAttemptMax + // " минут после непринятого вызова" + Environment.NewLine + // "Третья попытка - от " + Properties.Settings.Default.CallbackSecondAttemptMax + // " до " + Properties.Settings.Default.CallbackThirdAttemptMax + " минут после непринятого вызова", // "Дозвонились с одной попытки", // "Дозвонились с одной попытки", // "Дозвонились с двух попыток", // "Дозвонились с двух попыток", // "Дозвонились с трех попыток", // "Дозвонились с трех попыток", // "Дозвонились с более чем трех попыток", // "Дозвонились с более чем трех попыток", // "Пациент перезвонил самостоятельно", // "Пациент перезвонил самостоятельно", // "Не дозвонились", // "Не дозвонились", // "Не пытались перезвонить", // "% недозвона", // "% нарушения регламента", // //accidental // "Длительность меньше 6 секунд (количество)", // "Некорректные данные" + (Properties.Settings.Default.CalcRepeatedMissedAsOne ? ", повторяющиеся с одним номером" : "") + // (Properties.Settings.Default.IgnoreInternalMissedCalls ? ", внутренние номера" : "") + // (Properties.Settings.Default.IgnoreNonworkingTimeMissedCalls ? ", нерабочие часы до " + // Properties.Settings.Default.WorkingTimeBegin.ToString() + " и после " + // Properties.Settings.Default.WorkingTimeEnd.ToString() : "") + " (количество)", // "Общая длительность", // //dialed // "% от всех входящих", // "Количество", // "Общая длительность", // //header // "Расположение в книге" }; //int rowToStartFill = 1; //for (int i = 0; i < secondColumn.Length; i++) { // ws.Range["B" + rowToStartFill].Value = secondColumn[i]; // if (i < secondColumn.Length - 1 && secondColumn[i] == secondColumn[i + 1]) { // ws.Range["B" + rowToStartFill + ":B" + (rowToStartFill + 1)].Merge(); // i++; // rowToStartFill++; // } else { // if (!secondColumn[i].Equals("Не пытались перезвонить")) // ws.Range["B" + rowToStartFill + ":C" + rowToStartFill].Merge(); // } // rowToStartFill++; //} //string[] thirdColumn = { // "Регламент соблюден", // "Регламент нарушен", // "Регламент соблюден", // "Регламент нарушен", // "Регламент соблюден", // "Регламент нарушен", // "Регламент соблюден", // "Регламент нарушен", // "Регламент соблюден", // "Регламент нарушен", // "Регламент соблюден", // "Регламент нарушен", // "Регламент нарушен" //}; //rowToStartFill = 15; //foreach (string item in thirdColumn) { // ws.Range["C" + rowToStartFill].Value = item; // rowToStartFill++; //} //string headersRange = "B1:C36"; //ws.Range[headersRange].Borders.LineStyle = XlLineStyle.xlDot; //ws.Range[headersRange].BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium); //ws.Range[headersRange].VerticalAlignment = XlHAlign.xlHAlignCenter; ////ws.Range[headersRange].HorizontalAlignment = XlVAlign.xlVAlignCenter; //ws.Rows[14].RowHeight = 60; //ws.Columns[2].ColumnWidth = 42; //ws.Columns[3].ColumnWidth = 20; //int columnToStartFill = 4; //int listStartPosition = 1; //foreach (KeyValuePair<string, SpRecordFileInformation> fileInfo in filesInfo) { // SpRecordFileInformation info = fileInfo.Value; // int callsIncoming = info.CallsAccepted + info.CallsMissed + // info.CallsMissedAccidentialShort + info.CallsMissedAccidentialWrongValues; // int ringUpFailed = info.RingUpDidNotTried + // info.RingUpNotRegulationObserved + // info.RingUpNotRegulationNotObserved; // int regulationNotObserved = info.RingUp1tryRegulationNotObserved + // info.RingUp2tryRegulationNotObserved + // info.RingUp3tryRegulationNotObserved + // info.RingUp3MoreTryRegulationNotObserved + // info.RingUpByPatientRegulationNotObserved + // info.RingUpNotRegulationNotObserved + // info.RingUpDidNotTried; // int callsAccidential = info.CallsMissedAccidentialShort + info.CallsMissedAccidentialWrongValues; // string[] values = { // Path.GetFileName(fileInfo.Key), //Имя файла // info.WorkstationName, //Имя рабочей станции // info.CreationDate, //Дата создания // info.AccountingPeriod, //Отчетный период // info.CallsTotal.ToString(), //Количество // StringFromTimeSpan(info.TimeTotal), //Общая длительность // info.CallsAccepted.ToString(), //Количество // StringFromTimeSpan(info.TimeAccepted), //Общая длительность // StringFromTimeSpan(GetAverageDuration(info.TimeAccepted, info.CallsAccepted)), //Средняя длительность // info.CallsMissed.ToString(), //Количество // StringFromTimeSpan(info.TimeMissed), //Общая длительность // StringFromTimeSpan(GetAverageDuration(info.TimeMissed, info.CallsMissed)), //Средняя длительность // GetPercentage(info.CallsMissed, callsIncoming), //% от всех входящих // "", //Регламент работы // info.RingUp1tryRegulationObserved.ToString(), //Дозвонились с одной попытки Регламент соблюден // info.RingUp1tryRegulationNotObserved.ToString(), //Дозвонились с одной попытки Регламент нарушен // info.RingUp2tryRegulationObserved.ToString(), //Дозвонились с двух попыток Регламент соблюден // info.RingUp2tryRegulationNotObserved.ToString(), //Дозвонились с двух попыток Регламент нарушен // info.RingUp3tryRegulationObserved.ToString(), //Дозвонились с трех попыток Регламент соблюден // info.RingUp3tryRegulationNotObserved.ToString(), //Дозвонились с трех попыток Регламент нарушен // info.RingUp3MoreTryRegulationObserved.ToString(), //Дозвонились с более чем трех попыток Регламент соблюден // info.RingUp3MoreTryRegulationNotObserved.ToString(), //Дозвонились с более чем трех попыток Регламент нарушен // info.RingUpByPatientRegulationObserved.ToString(), //Пациент перезвонил самостоятельно Регламент соблюден // info.RingUpByPatientRegulationNotObserved.ToString(), //Пациент перезвонил самостоятельно Регламент нарушен // info.RingUpNotRegulationObserved.ToString(), //Не дозвонились Регламент соблюден // info.RingUpNotRegulationNotObserved.ToString(), //Не дозвонились Регламент нарушен // info.RingUpDidNotTried.ToString(), //Не пытались перезвонить Регламент нарушен // GetPercentage(ringUpFailed, info.CallsMissed), //% недозвона // GetPercentage(regulationNotObserved, info.CallsMissed), //% нарушения регламента // info.CallsMissedAccidentialShort.ToString(), //Длительность меньше 6 секунд (количество) // info.CallsMissedAccidentialWrongValues.ToString(), //Неправильные данные (количество) // StringFromTimeSpan(info.TimeAccidential), //Общая длительность // GetPercentage(callsAccidential, callsIncoming), //% от всех входящих // info.CallsDialed.ToString(), //Количество // StringFromTimeSpan(info.TimeDialed), //Общая длительность // "Лист " + listStartPosition}; //Расположение // int rowToFillValues = 1; // listStartPosition++; // string columnName = GetExcelColumnName(columnToStartFill); // foreach (string value in values) { // ws.Range[columnName + rowToFillValues].Value = value; // rowToFillValues++; // } // int colorIndex = 0; // if (callsIncoming > 0) { // double missedPercetage = (double)info.CallsMissed / (double)callsIncoming * 100; // if (missedPercetage <= Properties.Settings.Default.MissedCallsGoodMax) { // colorIndex = 36; //green // } else if (missedPercetage > Properties.Settings.Default.MissedCallsBadMin) { // colorIndex = 3; //red // } else { // colorIndex = 6; //yellow // } // if (colorIndex > 0) { // ws.Range[columnName + "13"].Interior.ColorIndex = colorIndex; // colorIndex = 0; // } // } // if (info.CallsMissed > 0) { // double regulationsNotObservedPercentage = // (double)regulationNotObserved / (double)info.CallsMissed * 100; // if (regulationsNotObservedPercentage <= Properties.Settings.Default.RegulationGoodMax) { // colorIndex = 36; //green // } else if (regulationsNotObservedPercentage > Properties.Settings.Default.RegulationBadMin) { // colorIndex = 3; //red // } else { // colorIndex = 6; //yellow // } // if (colorIndex > 0) { // ws.Range[columnName + "29"].Interior.ColorIndex = colorIndex; // } // } // ws.Columns[columnToStartFill].ColumnWidth = 25; // ws.Range[columnName + "1:" + columnName + (rowToFillValues - 1)]. // Borders.LineStyle = XlLineStyle.xlDot; // ws.Range[columnName + "1:" + columnName + (rowToFillValues - 1)]. // BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium); // columnToStartFill++; //} //ws.Rows[2].Font.Bold = true; //ws.Columns[1].Font.Bold = true; //string lastUsedColumn = GetExcelColumnName(columnToStartFill - 1); //string[] rangesBorderAround = { // //total // "A5:" + lastUsedColumn + "6", // //accepted // "A7:" + lastUsedColumn + "9", // //missed // //at glance // "B10:" + lastUsedColumn + "13", // //regulation // "B14:" + lastUsedColumn + "27", // //result // "B28:" + lastUsedColumn + "29", // //accidential // "A30:" + lastUsedColumn + "33", // //dialed // "A34:" + lastUsedColumn + "35", // //position // "B36:" + lastUsedColumn + "36" }; //foreach (string rangeBorderAround in rangesBorderAround) { // ws.Range[rangeBorderAround]. // BorderAround2(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium); //} //string[] rangesInteriorColor = { // "B13:C13", // "B29:C29" }; //foreach (string rangeInteriorColor in rangesInteriorColor) { // ws.Range[rangeInteriorColor].Interior.ColorIndex = 36; //} //ws.Rows[30].RowHeight = 15; //ws.Range["B2:" + lastUsedColumn + "2"].Interior.ColorIndex = 24; //ws.Application.ActiveWindow.SplitColumn = 3; //ws.Application.ActiveWindow.FreezePanes = true; xlApp.Quit(); Process.Start(folderToSave); return(true); } catch (Exception e) { LoggingSystem.LogMessageToFile(e.Message); LoggingSystem.LogMessageToFile(e.StackTrace); } return(false); }