private string GetFieldError(ApiRowErrors rowErrors, string field) { if (rowErrors == null) { return(null); } StringBuilder sb = null; foreach (var error in rowErrors.Errors) { if ( (field == "$id" && String.IsNullOrEmpty(error.Field)) || String.Equals(field, error.Field, StringComparison.OrdinalIgnoreCase) ) { if (sb == null) { sb = new StringBuilder(); } else { sb.AppendLine(); } sb.Append(error.Error); } } return(sb?.ToString()); }
public void Export(Stream stream, EntitySchema entity, RecordSet recordSet, ApiRowErrorsCollection errors) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (entity == null) { throw new ArgumentNullException(nameof(entity)); } if (recordSet == null) { throw new ArgumentNullException(nameof(recordSet)); } var workbook = new XSSFWorkbook(); var sheet = workbook.CreateSheet(PrettifyName(entity.Name)); sheet.DefaultRowHeightInPoints = 15; var errorColor = new XSSFColor(Color.Orange); var errorStyle = (XSSFCellStyle)workbook.CreateCellStyle(); errorStyle.FillForegroundColorColor = errorColor; errorStyle.FillPattern = FillPattern.SolidForeground; var headerStyle = CreateHeaderStyle(workbook); var dateStyle = CreateDateStyle(workbook, null, false); var dateErrorStyle = CreateDateStyle(workbook, errorColor, false); var dateTimeStyle = CreateDateStyle(workbook, null, true); var dateTimeErrorStyle = CreateDateStyle(workbook, errorColor, true); // Create the headers. var row = sheet.CreateRow(0); var fieldNames = recordSet[0].FieldNames.OrderBy(p => p.ToLower()).ToList(); for (int i = 0; i < fieldNames.Count; i++) { var member = entity.Members[fieldNames[i]]; AddHeader(row, i, HumanText.GetMemberName(member), member.Comments, headerStyle); } bool haveAutosized = false; Dictionary <int, ApiRowErrors> errorMap = null; if (errors != null) { errorMap = errors.ToDictionary(p => p.Row, p => p); } for (int i = 0; i < recordSet.Count; i++) { var record = recordSet[i]; row = sheet.CreateRow(i + 1); ApiRowErrors rowErrors = null; if (errorMap != null) { errorMap.TryGetValue(i, out rowErrors); } for (int j = 0; j < fieldNames.Count; j++) { ICellStyle cellStyle = null; if (rowErrors != null) { cellStyle = errorStyle; } var field = fieldNames[j]; switch (((EntityTypedField)entity.Members[field]).DataType) { case EntityDataType.Date: cellStyle = rowErrors == null ? dateStyle : dateErrorStyle; break; case EntityDataType.DateTime: case EntityDataType.DateTimeTz: cellStyle = rowErrors == null ? dateTimeStyle : dateTimeErrorStyle; break; } string fieldError = GetFieldError(rowErrors, field); object value = record.ContainsField(field) ? record[field] : null; AddCell(row, j, value, cellStyle, fieldError); } // We only auto size the top 20 rows for performance reasons. if (i == 20) { haveAutosized = true; AutoSizeColumns(fieldNames.Count, sheet); } } if (!haveAutosized) { AutoSizeColumns(fieldNames.Count, sheet); } workbook.Write(stream); }