private void ProcessRows(ExcelReportEngine engine, GridRow[] rows, int p, List <string> fields, IPropertyType[] checkedItems, int severityCol = 0) { if (checkedItems.Any()) { foreach (var item in checkedItems) { fields.Add(item.Name); } } engine.AddHeader(p, fields.ToArray()); List <object> values = new List <object>(); foreach (var row in rows) { values.Clear(); values.AddRange(row.Cells.Select(x => x.Value)); foreach (var item in checkedItems) { if (row.Tag is IPropertiesContainer container && container.GetProperty(item) is IProperty property) { if (property is IPropertyIdentityReference reference) { values.Add(reference.Value?.Name); } else { values.Add(property.StringValue); } } } var r = engine.AddRow(p, values.ToArray()); if (severityCol > 0) { var severity = _model.Severities.FirstOrDefault(x => string.CompareOrdinal(x.Name, values[severityCol - 1].ToString()) == 0); if (severity != null) { engine.ColorCell(p, r, severityCol, Color.FromKnownColor(severity.TextColor), Color.FromKnownColor(severity.BackColor)); } } } }
private bool SaveExcelFile([Required] string fileName) { var result = false; using (ExcelReportEngine engine = new ExcelReportEngine()) { if (_includeExternalInteractors.Checked) { var rows = _externalInteractors.PrimaryGrid.FlatCheckedRows.OfType <GridRow>().ToArray(); if (rows.Any()) { var p = engine.AddPage("External Interactors"); List <string> fields = new List <string> { "Name", "Description", "Parent" }; var checkedItems = _fieldsExternalInteractors.CheckedItems.OfType <IPropertyType>().ToArray(); ProcessRows(engine, rows, p, fields, checkedItems); } } if (_includeProcesses.Checked) { var rows = _processes.PrimaryGrid.FlatCheckedRows.OfType <GridRow>().ToArray(); if (rows.Any()) { var p = engine.AddPage("Processes"); List <string> fields = new List <string> { "Name", "Description", "Parent" }; var checkedItems = _fieldsProcesses.CheckedItems.OfType <IPropertyType>().ToArray(); ProcessRows(engine, rows, p, fields, checkedItems); } } if (_includeDataStores.Checked) { var rows = _dataStores.PrimaryGrid.FlatCheckedRows.OfType <GridRow>().ToArray(); if (rows.Any()) { var p = engine.AddPage("Data Stores"); List <string> fields = new List <string> { "Name", "Description", "Parent" }; var checkedItems = _fieldsDataStores.CheckedItems.OfType <IPropertyType>().ToArray(); ProcessRows(engine, rows, p, fields, checkedItems); } } if (_includeDataFlows.Checked) { var rows = _dataFlows.PrimaryGrid.FlatCheckedRows.OfType <GridRow>().ToArray(); if (rows.Any()) { var p = engine.AddPage("Flows"); List <string> fields = new List <string> { "Name", "Description", "Source", "Target", "Flow Type" }; var checkedItems = _fieldsDataFlows.CheckedItems.OfType <IPropertyType>().ToArray(); ProcessRows(engine, rows, p, fields, checkedItems); } } if (_includeThreatEvents.Checked) { var rows = _threatEvents.PrimaryGrid.FlatCheckedRows.OfType <GridRow>().ToArray(); if (rows.Any()) { var p = engine.AddPage("Threat Events"); List <string> fields = new List <string> { "Name", "Description", "Associated To Type", "Associated To", "Severity" }; var checkedItems = _fieldsThreatEvents.CheckedItems.OfType <IPropertyType>().ToArray(); ProcessRows(engine, rows, p, fields, checkedItems, 5); } } if (_includeMitigations.Checked) { var rows = _mitigations.PrimaryGrid.FlatCheckedRows.OfType <GridRow>().ToArray(); if (rows.Any()) { var p = engine.AddPage("Mitigations"); List <string> fields = new List <string> { "Name", "Description", "Control Type", "Threat Event", "Associated To Type", "Associated To", "Strength", "Status", "Directives" }; var checkedItems = _fieldsMitigations.CheckedItems.OfType <IPropertyType>().ToArray(); ProcessRows(engine, rows, p, fields, checkedItems); } } try { engine.Save(fileName); result = true; } catch (System.IO.IOException e) { ShowWarning?.Invoke(e.Message); } } return(result); }