public static async Task ImportFile <T>(MGrid <T> pGrid, Stream pFile) { using var doc = SpreadsheetDocument.Open(pFile, false); var worksheetPart = doc.WorkbookPart.WorksheetParts.FirstOrDefault(); var worksheet = worksheetPart.Worksheet; SharedStringTablePart sstpart = doc.WorkbookPart.GetPartsOfType <SharedStringTablePart>().FirstOrDefault(); SharedStringTable sst = sstpart?.SharedStringTable; var sheetdata = worksheet.OfType <SheetData>().FirstOrDefault(); var rows = sheetdata.OfType <Row>(); var firstValues = GetRow(doc, sst, rows.First()); var propInfo = GetPropertyInfos(pGrid.PropertyInfos, firstValues); if (!propInfo.Any()) { return; } foreach (var row in rows.Skip(1)) { var rowValues = GetRow(doc, sst, row); ProgressRow(propInfo, rowValues, (rowVal, pi) => { if (pi.GetCustomAttribute <RequiredAttribute>() != null && rowVal == null) { throw new UserMessageException($"Column {pi.Name} has an empty value!"); } }); } foreach (var row in rows.Skip(1)) { var rowValues = GetRow(doc, sst, row); T obj = pGrid.CreateNewT(); var proceeded = ProgressRow(propInfo, rowValues, (object rowVal, IMPropertyInfo pi) => { pi.SetValue(obj, rowVal); }); if (!proceeded) { continue; } pGrid.NewValue = obj; await pGrid.OnFormSubmit(new MFormSubmitArgs(null, new Dictionary <string, object>(), obj, true)); } }