using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using C4IT.FASD.Base; using FasdCockpitCommunicationDemo; using static C4IT.Logging.cLogManager; using Microsoft.Office.Interop.Excel; using Excel = Microsoft.Office.Interop.Excel; using System.Windows.Shapes; using System.Text.RegularExpressions; using FasdCockpitBase.Models; namespace FasdExcelToJsonConverter { public class cExcelHealthcardParser { private Dictionary workSheets; public cExcelHealthcardParser(Workbook selectedWorkBook) { if (LoadWorkSheets(selectedWorkBook, out var workSheets)) this.workSheets = workSheets; } private bool LoadWorkSheets(Workbook selectedWorkBook, out Dictionary workSheets) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); workSheets = new Dictionary(); if (selectedWorkBook == null) return false; try { foreach (Worksheet workSheet in selectedWorkBook.Worksheets) { workSheets.Add(workSheet.Name, workSheet); } return true; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return false; } public bool GetHealthcardDataFromExcel(string WorkSheetName, out cF4SDHealthCardJsonRawData HealthcardJsonData) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); HealthcardJsonData = new cF4SDHealthCardJsonRawData(); if (string.IsNullOrEmpty(WorkSheetName)) return false; try { if (!workSheets.TryGetValue(WorkSheetName, out var selectedWorkSheet)) return false; var range = selectedWorkSheet.UsedRange; var healthCardData = new cF4SDHealthCardRawData(); for (int excelRow = 2; excelRow <= range.Rows.Count; excelRow++) // start from 2 because not zero based and 1st row contains header { //Get values of excel row var values = new List(); for (int excelColumn = 3; excelColumn <= range.Columns.Count; excelColumn++) // start from 2 because not zero based and 1st and 2nd column contains ValueTable & ValueColumn { var cellValue = range.Cells[excelRow, excelColumn].Value as object; values.Add(cellValue); } //Get Table of Dictionary var valueTable = range.Cells[excelRow, 1].Value?.ToString(); if (!healthCardData.Tables.ContainsKey(valueTable)) healthCardData.Tables.Add(valueTable, new cF4SDHealthCardRawData.cHealthCardTable() { Name = valueTable }); //Add Columns if (healthCardData.Tables.TryGetValue(valueTable, out cF4SDHealthCardRawData.cHealthCardTable tableDictionaryEntry)) { var columnName = range.Cells[excelRow, 2].Value?.ToString(); if (tableDictionaryEntry.Columns.ContainsKey(columnName)) continue; tableDictionaryEntry.Columns.Add(columnName, new cF4SDHealthCardRawData.cHealthCardTableColumn(tableDictionaryEntry) { ColumnName = columnName, Values = values.ToList() }); if (tableDictionaryEntry.TimeFrames == null) tableDictionaryEntry.TimeFrames = new DateTime[1, 2]; if (tableDictionaryEntry.TimeFrames.GetLength(0) < values.Count) tableDictionaryEntry.TimeFrames = new DateTime[values.Count, 2]; } } foreach (var table in healthCardData.Tables) { table.Value.TimeFrames[0, 0] = DateTime.Now; table.Value.TimeFrames[0, 1] = DateTime.Today; for (int i = 1; i < table.Value.TimeFrames.GetLength(0) - 1; i++) { table.Value.TimeFrames[i, 0] = DateTime.Today.AddDays(-i); table.Value.TimeFrames[i, 1] = DateTime.Today.AddDays(-i - 1); } } HealthcardJsonData = cF4SDHealthCardJsonRawData.GetHealthCardJsonRawData(healthCardData); HealthcardJsonData.DetailsTables = GetDetailsTablesFromExcel(); HealthcardJsonData.Tickets = GetTicketsFromExcel(); return true; } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return false; } private List GetDetailsTablesFromExcel() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); var output = new List(); try { foreach (var workSheet in workSheets) { if (!workSheet.Key.StartsWith("details-")) continue; var selectedWorkSheet = workSheet.Value; var range = selectedWorkSheet.UsedRange; var tableName = workSheet.Key.Replace("details-", "agnt-computer-event-details-"); var tableColumns = new List(); for (int i = 2; i <= range.Columns.Count; i++) { tableColumns.Add(range.Cells[1, i].Value?.ToString()); } var tableValues = new Dictionary>(); for (int excelRow = 2; excelRow <= range.Rows.Count; excelRow++) { var dayValue = range.Cells[excelRow, 1].Value?.ToString(); int dayIndex = int.MinValue; if (DateTime.TryParse(dayValue, out DateTime dayDate)) dayIndex = (DateTime.Today - dayDate).Days; List rowValues = new List(); for (int excelColumn = 2; excelColumn <= range.Columns.Count; excelColumn++) { rowValues.Add(range.Cells[excelRow, excelColumn].Value); } if (tableValues.TryGetValue(dayIndex, out var dayValues)) dayValues.Add(rowValues.ToArray()); else tableValues.Add(dayIndex, new List() { rowValues.ToArray() }); } var tableToAdd = new cF4SDHealthCardRawData.cHealthCardDetailsTable() { Name = tableName, Columns = tableColumns, Values = tableValues }; output.Add(tableToAdd); } } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } private List GetTicketsFromExcel() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); List output = new List(); try { if (!workSheets.TryGetValue("%TicketData%", out var TicketWorksheet)) return output; Dictionary tempTickets = new Dictionary(); var ticketRange = TicketWorksheet.UsedRange; for (int row = 2; row <= ticketRange.Rows.Count; row++) { double ticketId = ticketRange.Cells[row, 1].Value; string affectedUser = ticketRange.Cells[row, 2].Value; double creationDaysSinceNow = ticketRange.Cells[row, 3].Value; DateTime creationDate = DateTime.Now.AddDays(-creationDaysSinceNow); double? closingDaysSinceNow = ticketRange.Cells[row, 4].Value; DateTime? closingDate = null; if (closingDaysSinceNow.HasValue) closingDate = DateTime.Now.AddDays(closingDaysSinceNow.Value); enumTicketStatus ticketStatus = enumTicketStatus.Unknown; Enum.TryParse(ticketRange.Cells[row, 5].Value?.ToString(), out ticketStatus); cF4SDTicket.enumTicketCreationSource creationSource = cF4SDTicket.enumTicketCreationSource.Unknown; Enum.TryParse(ticketRange.Cells[row, 6].Value, out creationSource); // classification = ticketRange.Cells[row, 7].Value; string asset = ticketRange.Cells[row, 8].Value; string ticketName = ticketRange.Cells[row, 9].Value; string summary = ticketRange.Cells[row, 10].Value; string category = ticketRange.Cells[row, 11].Value; double priority = ticketRange.Cells[row, 12].Value; string description = ticketRange.Cells[row, 13].Value; string htmlDescription = ticketRange.Cells[row, 14].Value; string solution = ticketRange.Cells[row, 15].Value; string directLinkPreview = ticketRange.Cells[row, 16].Value; string directLinkEdit = ticketRange.Cells[row, 17].Value; string directLinkClose = ticketRange.Cells[row, 18].Value; if (tempTickets.ContainsKey(ticketId)) { LogEntry($"Ticket with id {ticketId} allready exists."); continue; } cF4SDTicket tempTicket = new cF4SDTicket() { Id = Guid.NewGuid(), AffectedUser = affectedUser, CreationDaysSinceNow = creationDaysSinceNow, CreationDate = creationDate, ClosingDaysSinceNow = closingDaysSinceNow, ClosingDate = closingDate, Status = ticketStatus, CreationSource = creationSource, Asset = asset, Name = ticketName, Summary = summary, Category = category, Priority = (int)priority, Description = description, DescriptionHtml = htmlDescription, Solution = solution, JournalItems = new List(), DirectLinks = new Dictionary() }; if (!(string.IsNullOrWhiteSpace(directLinkPreview))) { tempTicket.DirectLinks.Add("DirectLinkPreview", directLinkPreview); var ticketIdString = Regex.Match(directLinkPreview, @"[0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}"); if (ticketIdString.Success && Guid.TryParse(ticketIdString.Value, out var tempTicketId)) tempTicket.Id = tempTicketId; } if (!(string.IsNullOrWhiteSpace(directLinkEdit))) tempTicket.DirectLinks.Add("DirectLinkEdit", directLinkEdit); if (!(string.IsNullOrWhiteSpace(directLinkClose))) tempTicket.DirectLinks.Add("DirectLinkClose", directLinkClose); tempTickets.Add(ticketId, tempTicket); } output = tempTickets.Values.ToList(); if (!workSheets.TryGetValue("%TicketDetails%", out var DetailsWorksheet)) return output; var detailRange = DetailsWorksheet.UsedRange; for (int row = 2; row <= detailRange.Rows.Count; row++) { double ticketId = detailRange.Cells[row, 1].Value; double creationDaysSinceNow = detailRange.Cells[row, 2].Value; DateTime creationDate = DateTime.Now.AddDays(-creationDaysSinceNow); bool isVisibleForUser = bool.Parse(detailRange.Cells[row, 3].Value); string header = detailRange.Cells[row, 4].Value; string createdBy = detailRange.Cells[row, 5].Value; string description = detailRange.Cells[row, 6].Value; var tempJournalItem = new cF4SDTicket.cTicketJournalItem() { CreationDaysSinceNow = creationDaysSinceNow, CreationDate = creationDate, IsVisibleForUser = isVisibleForUser, Header = header, CreatedBy = createdBy, Description = description }; if (tempTickets.ContainsKey(ticketId)) { var tempJournalItems = tempTickets[ticketId].JournalItems; if (tempJournalItems is null) tempJournalItems = new List(); tempJournalItems.Add(tempJournalItem); } } output = tempTickets.Values.ToList(); } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return output; } } }