private bool ValidateXLSX(bool saveChanges) { //получаем коллекцию ключей Dictionary <string, ElementType> keys = new Dictionary <string, ElementType>(); ElementImport.CustomerRequest = _context.CustomerRequests .Include(e => e.Customer) .Include(m => m.Program) .ThenInclude(e => e.ElementntTypes) .ThenInclude(e => e.Keys) .FirstOrDefault(e => e.CustomerRequestID == ElementImport.CustomerRequestID); //заполняем коллецию ключей foreach (var itemET in ElementImport.CustomerRequest.Program.ElementntTypes) { foreach (var itemKey in itemET.Keys) { keys.Add(itemKey.Key, itemET); } } //функция возвращает true только когда все элементы валидны; bool returnValue = true; if (ElementImport.XLSXElementTypes == null) { return(false); } //перебираем все загрузки foreach (var itemXLSX in ElementImport.XLSXElementTypes) { itemXLSX.Valid = false; itemXLSX.ErrorMessage = ""; itemXLSX.ElementName ??= ""; itemXLSX.ElementTypeKey ??= ""; if (!itemXLSX.InList & saveChanges) { _context.Attach(itemXLSX).State = EntityState.Deleted; XLSXElementType item = _context.XLSXElementTypes.FirstOrDefault(m => m.ID == itemXLSX.ID); //ElementImport.XLSXElementTypes.Remove(itemXLSX); continue; } //нет имени - не загружаем if (PrepareStr(itemXLSX.ElementName) == "") { itemXLSX.ErrorMessage = "Имя элемента не заполнено"; returnValue = false; continue; } if (PrepareStr(itemXLSX.ElementTypeKey) == "") { itemXLSX.ErrorMessage = "Ключ для элемента не заполнен."; returnValue = false; continue; } XLSXElementType beforeItem = new XLSXElementType(); beforeItem = BeforeUploadedXLSXElementType(itemXLSX.ElementName, itemXLSX.ID, ElementImport.CustomerRequest.TestProgramID); //Если предыдущий типономина найден и ему присвоен тип if (!((beforeItem != null? beforeItem.ElementTypeID:0) > 0)) { // ищем в коллекции ключей foreach (var key in keys) { if (PrepareStr(itemXLSX.ElementTypeKey) == PrepareStr(key.Key)) { itemXLSX.ElementTypeID = keys[key.Key].ElementTypeID; itemXLSX.ErrorMessage = ""; itemXLSX.Valid = true; itemXLSX.ElementTypeName = keys[key.Key].Name; break; } } } else { // берем значения из ранее загруженного изделия itemXLSX.ElementTypeID = beforeItem.ElementTypeID; itemXLSX.ElementTypeKey = beforeItem.ElementTypeKey; itemXLSX.ErrorMessage = ""; itemXLSX.Valid = true; itemXLSX.BeforeUploadedXLSXElementTypeID = beforeItem.ID; itemXLSX.ElementTypeName = ElementImport.CustomerRequest.Program.ElementntTypes.FirstOrDefault(m => m.ElementTypeID == itemXLSX.ElementTypeID).Name ?? ""; } if (itemXLSX.ElementTypeID > 0) { //Ищем такой элемент в ASU, если надо bool checkElemenTypeInAsu = ElementImport.CustomerRequest.Program.ElementntTypes.FirstOrDefault(m => m.ElementTypeID == itemXLSX.ElementTypeID).CheckInAsu; if (UseAsu & itemXLSX.Valid & checkElemenTypeInAsu) { string protokolName = LastAsuProtokolNumber(itemXLSX.ElementName); if (!String.IsNullOrWhiteSpace(protokolName)) { itemXLSX.AsuProtokolCode = protokolName; } } } if (!itemXLSX.Valid) { itemXLSX.ErrorMessage = "Ключ не найден."; returnValue = false; } if (saveChanges) { XLSXElementType item = _context.XLSXElementTypes.FirstOrDefault(m => m.ID == itemXLSX.ID); item.ElementTypeKey = itemXLSX.ElementTypeKey ?? ""; item.ElementName = itemXLSX.ElementName ?? ""; item.ElementCount = itemXLSX.ElementCount; item.ElementTypeID = itemXLSX.ElementTypeID; item.BeforeUploadedXLSXElementTypeID = itemXLSX.BeforeUploadedXLSXElementTypeID; _context.Entry(item).State = EntityState.Modified; } } return(returnValue); }
public List <Estimator.Models.XLSXElementType> Convert(Stream memStream, Estimator.Models.ElementImport importSettings) { List <Models.XLSXElementType> returnValue = new List <XLSXElementType>(); using (SpreadsheetDocument doc = SpreadsheetDocument.Open(memStream, false)) { XLSXElementType elementType; memStream.Position = 0; ///shared ячейки (в которых хранятся повторяемые значения). Так вот, из объекта класса SpreadsheetDocument их можно получить так: SharedStringTable sharedStringTable = doc.WorkbookPart.SharedStringTablePart.SharedStringTable; //используем только первый лист! WorksheetPart worksheetPart = doc.WorkbookPart.WorksheetParts.First(); //перебираем все строки foreach (SheetData sheetData in worksheetPart.Worksheet.Elements <SheetData>()) { if (sheetData.HasChildren) { foreach (Row row in sheetData.Elements <Row>()) { // if (importSettings.FirstRowIsHeader) if (row.RowIndex > 1 | !importSettings.FirstRowIsHeader) { elementType = new XLSXElementType(); foreach (Cell cell in row.Elements <Cell>()) { string cellValue = string.Empty; string refName = importSettings.ElementNameColumn.ToString() + row.RowIndex.ToString(); string refKey = importSettings.ElementTypeKeyColumn.ToString() + row.RowIndex.ToString(); string refCount = importSettings.ElementCountColumn.ToString() + row.RowIndex.ToString(); if (cell.CellReference.Value.ToString() == refName) { elementType.ElementName = getCellvalue(cell, sharedStringTable); } else if (cell.CellReference.Value.ToString() == refKey) { elementType.ElementTypeKey = getCellvalue(cell, sharedStringTable); } else if (cell.CellReference.Value.ToString() == refCount) { int i; int.TryParse(getCellvalue(cell, sharedStringTable), out i); elementType.ElementCount = i; } } // если колличествов данной строке = 0 то нефиг его и импортировать if (elementType.ElementCount > 0) { returnValue.Add(elementType); } } } } } } return(returnValue); }