private void LoadDiscsFromReader(SpreadsheetReader reader, LoadResult result) { //проверка наличия в файле единственного листа с заказом reader.CurrentSheet = 0; int numOfFields = 9; List<RmsAuto.Store.Cms.Entities.Disc> t = new List<RmsAuto.Store.Cms.Entities.Disc>(); for (int r = 1; r < reader.RecordCount; r++) { string[] rec = new string[numOfFields]; for (int i = 0; i < numOfFields; i++) rec[i] = reader[r, i]; rec = rec.Each(s => s.Trim()).ToArray(); if (rec.All(s => s == "")) continue; if (rec.All(s => string.IsNullOrEmpty(s))) { break; } var t1 = new RmsAuto.Store.Cms.Entities.Disc(); for (int c = 0; c < numOfFields; c++) { string value = rec[c]; try { switch (c) { case 0: t1.Manufacturer = value; break; case 1: t1.ModelName = value; break; case 2: t1.PartNumber = value; break; case 3: t1.Width = Decimal.Parse(value); break; case 4: t1.Diameter = Decimal.Parse(value); break; case 5: t1.Gab = Decimal.Parse(value); break; case 6: t1.PCD = value; break; case 7: t1.Dia = Decimal.Parse(value); break; } } catch { //TODO допилить обработку ошибок } } t.Add(t1); } using (CmsDataContext cms = new CmsDataContext()) { try { cms.Connection.Open(); cms.Transaction = cms.Connection.BeginTransaction(); var current = cms.Discs.Select(x => x).ToList(); current.Sort(new DiscComparer()); t.Sort(new DiscComparer()); t = t.Select(x => x).Distinct(new DiscComparer()).ToList(); //Пробегаем по каждому объекту каталога и смотрим какая у него была картинка foreach (var RefObj in t) { var tmp = current.Where(x => x.PartNumber == RefObj.PartNumber).FirstOrDefault(); RefObj.ImageUrl = tmp != null && tmp.ImageUrl.HasValue ? tmp.ImageUrl : (int)NoPhotoID.Disc; } // "мерджим" старое и новое t = t.UnionAndDistinct<RmsAuto.Store.Cms.Entities.Disc>(current, new DiscComparer()); cms.Discs.DeleteAllOnSubmit(current); cms.Discs.InsertAllOnSubmit(t); cms.SubmitChanges(ConflictMode.ContinueOnConflict); cms.Transaction.Commit(); Response.Redirect(Request.Url.ToString()); } catch (ChangeConflictException) { //TODO допилить обработку ошибок //Если не удалось изменить какую-то одну запись это не значит что нужно делать откат всего } catch (Exception) { cms.Transaction.Rollback(); //ShowMessage("Указано неиспользуемое имя бренда"); Logger.WriteError("Ошибка при сохранении результатов загрузки дисков", EventLogerID.BLException, EventLogerCategory.BLError); } finally { if (cms.Connection.State == System.Data.ConnectionState.Open) { cms.Connection.Close(); } } } }
/// <summary> /// Разбор Excel файла /// </summary> /// <param name="reader">объект чтения</param> private void LoadOrderFromReader( SpreadsheetReader reader ) { Dictionary<SparePartPriceKey, int> groupRows = new Dictionary<SparePartPriceKey, int>(); //проверка наличия в файле единственного листа с заказом reader.CurrentSheet = 0; if (reader.SheetCount > 1) { AddError(ErrorReason.SingleSheetRequired, ""); return; } if (reader.RecordCount <= _first_row) { AddError(ErrorReason.EmptyOrder, _first_row.ToString() ); return; } //импорт номера заказа try { string orderNum = reader[_order_num_cell.Y, _order_num_cell.X]; CustOrderNum = (orderNum ?? "").Trim(); Session["CustOrderNum"] = CustOrderNum; } catch { AddError(ErrorReason.InvalidOrderNumber, ""); return; } int ItemsRead = 0; rowsOK.Clear(); rowsAccept.Clear(); rowsER.Clear(); rowsERQty.Clear(); //импорт строк заказа using (var DC = new DCFactory<StoreDataContext>()) { var userSet = DC.DataContext.spSelUserSetting(SiteContext.Current.User.UserId).FirstOrDefault(); RmsAuto.Acctg.ClientGroup _clientGroup = SiteContext.Current.CurrentClient.Profile.ClientGroup; decimal _personalMarkup = SiteContext.Current.CurrentClient.Profile.PersonalMarkup; byte PrcExcessPrice = userSet == null ? (byte)0 : userSet.PrcExcessPrice; _txtPrc.Text = string.Format(Resources.CartImport.PrcExcessPrice + ": <b>{0}</b>", PrcExcessPrice); CheckExcelRestrictions(reader.RecordCount - 5/* т.к. в шапке 5 строк, а reader.RecordCount - общее кол-во строк в файле */); for (int r = _first_row; r < reader.RecordCount; r++) { string[] rec = { reader[r, 0], reader[r, 1], reader[r, 2], reader[r, 3], reader[r, 4], reader[r, 5], reader[r, 6], reader[r, 7] }; rec = rec.Each(s => s.Trim()).ToArray(); if (rec.All(s => s == "")) continue; if (rec.All(s => string.IsNullOrEmpty(s))) { if (r == _first_row) { AddError(ErrorReason.EmptyOrder, r.ToString()); } break; } ItemsRead++; bool recIsValid = true; string errorText = ""; int supplierId = 0; if (!int.TryParse(rec[1], out supplierId)) { errorText += TextError(ErrorReason.InvalidSupplierID, "") + "<br />"; recIsValid = false; } string manufacturer = rec[2]; if (string.IsNullOrEmpty(manufacturer)) { errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />"; recIsValid = false; } string partNumber = rec[3]; if (string.IsNullOrEmpty(partNumber)) { errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />"; recIsValid = false; } int quantity = 0; if (!int.TryParse(rec[4], out quantity)) { errorText += TextError(ErrorReason.InvalidQuantity, "") + "<br />"; recIsValid = false; } string referenceID = rec[6] ?? ""; if (referenceID.Length > ShoppingCartAddItem.ReferenceIDLength) { referenceID = referenceID.Substring(0, ShoppingCartAddItem.ReferenceIDLength); } bool strictlyThisNumber = !string.IsNullOrEmpty(rec[5]); decimal priceClient = 0M; if (!string.IsNullOrEmpty(rec[7]) && !decimal.TryParse(rec[7], out priceClient)) { errorText += TextError(ErrorReason.InvalidPrice, "") + "<br />"; recIsValid = false; } SparePartFranch part = null; // проверка существования элемента if (recIsValid) { try { SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId); part = SparePartsDac.Load(DC.DataContext, SPPK); if (part == null) { recIsValid = false; errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />"; } } catch (ArgumentNullException e) { recIsValid = false; errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />"; } catch (InvalidOperationException e) { recIsValid = false; errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />"; } } if (recIsValid) { SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId); // набор сгруппированной корзины для количественного анализа if (groupRows.ContainsKey(SPPK)) { groupRows[SPPK] += quantity; } else { groupRows.Add(SPPK, quantity); } // проверка цены decimal priceCurr = part.GetFinalSalePrice(_clientGroup, _personalMarkup); decimal pPrc = priceClient == 0 ? 0M : (priceCurr - priceClient) * 100 / priceClient; // формирование положительного и подверждающего списков if ( /*priceClient == 0 ||*/ (priceClient + Math.Round(priceClient * PrcExcessPrice / 100, 2) >= priceCurr)) { rowsOK.Add(new CartImportRow { rowID = Guid.NewGuid(), manufacturer = manufacturer, partNumber = partNumber, supplierId = supplierId, referenceID = referenceID, deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(), itemName = part.PartDescription, priceClient = priceClient, priceCurr = priceCurr, pricePrc = string.Format("{0:#####0.00}", pPrc), quantity = quantity, rowN = rec[0] ?? "", strictlyThisNumber = strictlyThisNumber }); } else { // Если обнаружен факт превышения цены, то проверяем является ли текущий пользователь // "особым" пользователем, который имеет право загружать детали по "вчерашней" цене // и если это так то вычисляем "вчерашнюю" цену добавляем к ней допустимый % превышения // для этого пользователя и записываем в специальное поле (если оно заполнено то в цену // в заказ пойдет цена из этого поля) decimal? priceClientYesterday = null; bool isErrorPrice = false; if (SpecialUsers.Contains(SiteContext.Current.User.UserId) && OwnStores != null && OwnStores.Contains(part.SupplierID)) { using (var dc = new dcCommonDataContext()) { try { //получаем список "вчерашних" и сегодняшних цен фтп для сравнения //если загрузка производится в понедельник, то "вчерашние" цены фтп должны браться по пятнице, субботе и воскресенью #region === old stored procedure === //string queryTemplate = "exec srvdb4.az.dbo.spGetPricesOnDate @Number = '{0}', @Brand = '{1}', @Date = '{2}', @PriceColumn = {3}"; #endregion string queryTemplate = "exec srvdb4.az.dbo.spGetPricesOnPeriod @Number='{0}', @Brand='{1}', @DateFrom='{2}', @DateTo='{3}', @PriceColumn={4}"; DateTime dateFrom = (DateTime.Now.DayOfWeek == DayOfWeek.Monday) ? DateTime.Now.AddDays(-3) : DateTime.Now.AddDays(-1); DateTime dateTo = DateTime.Now; List<decimal> prices = dc.ExecuteQuery<decimal>( string.Format(queryTemplate, part.PartNumber, part.Manufacturer, dateFrom.ToString("yyyyMMdd"), dateTo.ToString("yyyyMMdd"), (int)SiteContext.Current.CurrentClient.Profile.ClientGroup)) .ToList<decimal>(); //для каждой из цен производим сравнение с ценой клиента в 'Excel' +- 1 копейка (чтобы учесть возможные погрешности при округлении) foreach (var price in prices) { decimal pExcell = Math.Round(priceClient, 2); //цена клиента в 'Excel' decimal pFtp = Math.Round(price, 2); //одна из вчерашних цен нашего Ftp if (pExcell > 0 && (pExcell == pFtp || pExcell == (pFtp - 0.01M) || pExcell == (pFtp + 0.01M))) { //добавляем допустимый % превышения (доли копеек отбрасываем) priceClientYesterday = pFtp + pFtp * PrcExcessPrice / 100; priceClientYesterday = decimal.Truncate((decimal)priceClientYesterday * 100) / 100; break; } } //если ни одного совпадения не найдено, то позиция отваливается с ошибкой "Несоответствие цены ФТП-прайсу" isErrorPrice = (prices.Count() > 0 && !priceClientYesterday.HasValue); } catch (Exception ex) { Logger.WriteError(@"При вычислении 'Вчерашней' цены произошла ошибка!", EventLogerID.UnknownError, EventLogerCategory.UnknownCategory, ex); } finally { if (dc.Connection.State == System.Data.ConnectionState.Open) dc.Connection.Close(); } } } if (isErrorPrice) { rowsER.Add(new CartImportRowError() { order = 20, error = Resources.CartImport.InvalidFtpPrice /*"Несоответствие цены ФТП-прайсу"*/, manufacturer = rec[2], partNumber = rec[3], supplierId = rec[1], priceClient = rec[7], quantity = rec[4], referenceID = rec[6], rowN = rec[0], strictlyThisNumber = rec[5] }); } else { rowsAccept.Add(new CartImportRow { rowID = Guid.NewGuid(), manufacturer = manufacturer, partNumber = partNumber, supplierId = supplierId, referenceID = referenceID, deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(), itemName = part.PartDescription, priceClient = priceClient, priceCurr = priceCurr, pricePrc = priceClient == 0 ? "100.00" : (PrcExcessPrice == 0 ? pPrc < 0.01M ? "<0.01" : string.Format("{0:#####0.00}", pPrc) : pPrc > PrcExcessPrice && pPrc < (PrcExcessPrice + 0.01M) ? string.Format(">{0:#0.00}", PrcExcessPrice) : string.Format("{0:#####0.00}", pPrc)), quantity = quantity, rowN = rec[0] ?? "", strictlyThisNumber = strictlyThisNumber, priceClientYesterday = priceClientYesterday }); } } } else { rowsER.Add(new CartImportRowError() { order = 20, error = errorText, manufacturer = rec[2], partNumber = rec[3], supplierId = rec[1], priceClient = rec[7], quantity = rec[4], referenceID = rec[6], rowN = rec[0], strictlyThisNumber = rec[5] }); } } // количественные проверки foreach (SparePartPriceKey SPPK in groupRows.Keys) { string errorText = ""; SparePartFranch part = SparePartsDac.Load(DC.DataContext, SPPK); if (groupRows[SPPK] < part.DefaultOrderQty) { // Минимальное необходимое количество для заказа errorText += String.Format( Resources.CartImport.MinOrderQuantity /*"минимальное необходимое количество для заказа: {0}"*/, part.MinOrderQty); } else if (groupRows[SPPK] % part.DefaultOrderQty != 0) { // Количество должно быть кратным числу деталей в комплекте errorText += Resources.CartImport.ShallDivisibleQuantity /*"количество должно быть кратным числу деталей в комплекте ("*/ + part.DefaultOrderQty .Progression(part.DefaultOrderQty, 5) .Select(i => i.ToString()) .Aggregate((acc, s) => acc + "," + s) + Resources.CartImport.etc_withRightBracket /*" и т.д.)"*/; } if (part.QtyInStock.GetValueOrDefault() > 0 && groupRows[SPPK] > part.QtyInStock) { // Количество превышает допустимый лимит errorText += String.Format( Resources.CartImport.QuantityExceedsAvailable /*"заказанное количество превышает остатки склада, доступно: {0}"*/, part.QtyInStock); } if (!string.IsNullOrEmpty(errorText)) { // при наличии ошибок перекидываем из успешных списков в список количественных ошибок var tAcc = rowsAccept.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList(); AddToERQty(false, errorText, rowsAccept, tAcc); var tOK = rowsOK.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList(); AddToERQty(true, errorText, rowsOK, tOK); } } } }
private void LoadOrderFromReaderFranch(SpreadsheetReader reader) { Dictionary<SparePartPriceKey, int> groupRows = new Dictionary<SparePartPriceKey, int>(); //проверка наличия в файле единственного листа с заказом reader.CurrentSheet = 0; if (reader.SheetCount > 1) { AddError(ErrorReason.SingleSheetRequired, ""); return; } if (reader.RecordCount <= _first_row) { AddError(ErrorReason.EmptyOrder, _first_row.ToString()); return; } //импорт номера заказа try { string orderNum = reader[_order_num_cell.Y, _order_num_cell.X]; CustOrderNum = (orderNum ?? "").Trim(); Session["CustOrderNum"] = CustOrderNum; } catch { AddError(ErrorReason.InvalidOrderNumber, ""); return; } int ItemsRead = 0; rowsOK.Clear(); rowsAccept.Clear(); rowsER.Clear(); rowsERQty.Clear(); parts.Clear(); //импорт строк заказа using (var FDC = new DCFactory<StoreDataContext>()) { //StoreDataContext DC = new StoreDataContext(); StoreDataContext DC = FDC.DataContext; var userSet = DC.spSelUserSetting(SiteContext.Current.User.UserId).FirstOrDefault(); RmsAuto.Acctg.ClientGroup _clientGroup = SiteContext.Current.CurrentClient.Profile.ClientGroup; decimal _personalMarkup = SiteContext.Current.CurrentClient.Profile.PersonalMarkup; byte PrcExcessPrice = userSet == null ? (byte)0 : userSet.PrcExcessPrice; _txtPrc.Text = string.Format("{0}: <b>{1}</b>", Resources.CartImport.PrcExcessPrice, PrcExcessPrice); for (int r = _first_row; r < reader.RecordCount; r++) { string[] rec = { reader[r, 0], reader[r, 1], reader[r, 2], reader[r, 3], reader[r, 4], reader[r, 5], reader[r, 6], reader[r, 7] }; rec = rec.Each(s => s.Trim()).ToArray(); if (rec.All(s => s == "")) continue; if (rec.All(s => string.IsNullOrEmpty(s))) { if (r == _first_row) { AddError(ErrorReason.EmptyOrder, r.ToString()); } break; } ItemsRead++; bool recIsValid = true; string errorText = ""; int supplierId = 0; if (!int.TryParse(rec[1], out supplierId)) { errorText += TextError(ErrorReason.InvalidSupplierID, "") + "<br />"; recIsValid = false; } string manufacturer = rec[2]; if (string.IsNullOrEmpty(manufacturer)) { errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />"; recIsValid = false; } string partNumber = rec[3]; if (string.IsNullOrEmpty(partNumber)) { errorText += TextError(ErrorReason.InvalidPartNumber, "") + "<br />"; recIsValid = false; } int quantity = 0; if (!int.TryParse(rec[4], out quantity)) { errorText += TextError(ErrorReason.InvalidQuantity, "") + "<br />"; recIsValid = false; } string referenceID = rec[6] ?? ""; if (referenceID.Length > ShoppingCartAddItem.ReferenceIDLength) { referenceID = referenceID.Substring(0, ShoppingCartAddItem.ReferenceIDLength); } bool strictlyThisNumber = !string.IsNullOrEmpty(rec[5]); decimal priceClient = 0M; if (!string.IsNullOrEmpty(rec[7]) && !decimal.TryParse(rec[7], out priceClient)) { errorText += TextError(ErrorReason.InvalidPrice, "") + "<br />"; recIsValid = false; } SparePartFranch part = null; // проверка существования элемента if (recIsValid) { try { SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId); //part = SparePartsDac.Load(DC, SPPK); part = SparePartsDacFranch.Load(DC, SPPK); if (part == null) { recIsValid = false; errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />"; } } catch (ArgumentNullException e) { recIsValid = false; errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />"; } catch (InvalidOperationException e) { recIsValid = false; errorText += TextError(ErrorReason.ItemDoesNotExist, "") + "<br />"; } catch (Exception e) { Response.Write(e.StackTrace.ToString()); errorText += e.StackTrace.ToString(); } } if (recIsValid) { SparePartPriceKey SPPK = new SparePartPriceKey(manufacturer, partNumber, supplierId); // набор сгруппированной корзины для количественного анализа if (groupRows.ContainsKey(SPPK)) { groupRows[SPPK] += quantity; } else { groupRows.Add(SPPK, quantity); } parts.Add(part); // проверка цены decimal priceCurr = part.GetFinalSalePrice(_clientGroup, _personalMarkup); decimal pPrc = priceClient == 0 ? 0M : (priceCurr - priceClient) * 100 / priceClient; // формирование положительного и подверждающего списков if (/*priceClient == 0 ||*/ (priceClient + Math.Round(priceClient * PrcExcessPrice / 100, 2) >= priceCurr)) { rowsOK.Add(new CartImportRow { rowID = Guid.NewGuid(), manufacturer = manufacturer, partNumber = partNumber, supplierId = supplierId, referenceID = referenceID, deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(), itemName = part.PartDescription, priceClient = priceClient, priceCurr = priceCurr, pricePrc = string.Format("{0:#####0.00}", pPrc), quantity = quantity, rowN = rec[0] ?? "", strictlyThisNumber = strictlyThisNumber }); } else { rowsAccept.Add(new CartImportRow { rowID = Guid.NewGuid(), manufacturer = manufacturer, partNumber = partNumber, supplierId = supplierId, referenceID = referenceID, deliveryPeriod = part.DisplayDeliveryDaysMin.ToString() + "-" + part.DisplayDeliveryDaysMax.ToString(), itemName = part.PartDescription, priceClient = priceClient, priceCurr = priceCurr, pricePrc = priceClient == 0 ? "100.00" : (PrcExcessPrice == 0 ? pPrc < 0.01M ? "<0.01" : string.Format("{0:#####0.00}", pPrc) : pPrc > PrcExcessPrice && pPrc < (PrcExcessPrice + 0.01M) ? string.Format(">{0:#0.00}", PrcExcessPrice) : string.Format("{0:#####0.00}", pPrc)), quantity = quantity, rowN = rec[0] ?? "", strictlyThisNumber = strictlyThisNumber }); } } else { rowsER.Add(new CartImportRowError() { order = 20, error = errorText, manufacturer = rec[2], partNumber = rec[3], supplierId = rec[1], priceClient = rec[7], quantity = rec[4], referenceID = rec[6], rowN = rec[0], strictlyThisNumber = rec[5] }); } } //количественные проверки foreach (SparePartPriceKey SPPK in groupRows.Keys) { string errorText = ""; //SparePartFranch part = SparePartsDac.Load(DC, SPPK); //SparePartFranch part = SparePartsDacFranch.Load(DC, SPPK); SparePartFranch part = parts.Where(x => x.Manufacturer.ToLower() == SPPK.Mfr.ToLower() && x.PartNumber.ToLower() == SPPK.PN.ToLower() && x.SupplierID == SPPK.SupplierId).SingleOrDefault(); if (groupRows[SPPK] < part.DefaultOrderQty) { // Минимальное необходимое количество для заказа errorText += String.Format( Resources.CartImport.MinOrderQuantity /*"минимальное необходимое количество для заказа: {0}"*/, part.MinOrderQty); } else if (groupRows[SPPK] % part.DefaultOrderQty != 0) { // Количество должно быть кратным числу деталей в комплекте errorText += Resources.CartImport.ShallDivisibleQuantity /*"количество должно быть кратным числу деталей в комплекте ("*/ + part.DefaultOrderQty .Progression(part.DefaultOrderQty, 5) .Select(i => i.ToString()) .Aggregate((acc, s) => acc + "," + s) + Resources.CartImport.etc_withRightBracket /*" и т.д.)"*/; } if (part.QtyInStock.GetValueOrDefault() > 0 && groupRows[SPPK] > part.QtyInStock) { // Количество превышает допустимый лимит errorText += String.Format( Resources.CartImport.QuantityExceedsAvailable /*"заказанное количество превышает остатки склада, доступно: {0}"*/, part.QtyInStock); } if (!string.IsNullOrEmpty(errorText)) { // при наличии ошибок перекидываем из успешных списков в список количественных ошибок var tAcc = rowsAccept.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList(); AddToERQty(false, errorText, rowsAccept, tAcc); var tOK = rowsOK.Where(t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId).ToList(); AddToERQty(true, errorText, rowsOK, tOK); } } } }
public static List <Cell> FindCells(string Range, WorksheetPart worksheetPart) { Worksheet worksheet = worksheetPart.Worksheet; SheetData sheetData = worksheet.GetFirstChild <SheetData>(); Range = Range.Replace("$", ""); string FirstReference = Range.Split(':')[0], LastReference = Range.Split(':')[1]; uint FirstrowIndex = SpreadsheetReader.RowFromReference(FirstReference); uint LastrowIndex = SpreadsheetReader.RowFromReference(LastReference); int FirstcolumnIndex = SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(FirstReference)); int LastcolumnIndex = SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(LastReference)); IEnumerable <Row> match = sheetData.Elements <Row>().Where(r => r.RowIndex.Value >= FirstrowIndex && r.RowIndex.Value <= LastrowIndex); List <Cell> listCells = new List <Cell>(); foreach (Row row in match) { foreach (Cell cell in row) { if (SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(cell.CellReference.Value)) >= FirstcolumnIndex && SpreadsheetReader.GetColumnIndex(SpreadsheetReader.ColumnFromReference(cell.CellReference.Value)) <= LastcolumnIndex) { if (cell.CellValue != null) { double d; if (cell.DataType != null) { if (cell.DataType.Value == CellValues.Number || cell.DataType.Value == CellValues.SharedString) { listCells.Add(cell); } if (cell.DataType.Value == CellValues.String) { if (double.TryParse(cell.CellValue.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CreateSpecificCulture("en-US"), out d)) { listCells.Add(cell); } } } else if (double.TryParse(cell.CellValue.Text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CreateSpecificCulture("en-US"), out d)) { listCells.Add(cell); } } else if (cell.CellFormula != null) { listCells.Add(cell); } } } } return(listCells); }
/// <summary> /// Разбор Excel файла /// </summary> /// <param name="reader">объект чтения</param> private void LoadStatusesFromReader(SpreadsheetReader reader) { //проверка наличия в файле единственного листа с заказом reader.CurrentSheet = 0; if (reader.SheetCount > 1) { AddError(ErrorReason.SingleSheetRequired, ""); return; } int numOfFields = 9; // ID текущего менеджера по идее int managerUserID = SiteContext.Current.User.UserId; for (int r = 1; r < reader.RecordCount; r++) { string[] rec = new string[numOfFields]; for (int i = 0; i < numOfFields; i++) { rec[i] = reader[r, i]; } rec = rec.Each(s => s.Trim()).ToArray(); if (rec.All(s => s == "")) { continue; } if (rec.All(s => string.IsNullOrEmpty(s))) { break; } _res.Add(new TempOLStatuse() { ManagerUserID = managerUserID, SupplierID = rec[1], Manufacturer = rec[2], PartNumber = rec[3], Qty = rec[4], AcctgOrderLineID = rec[5], CurrentStatus = byte.Parse(rec[6]), NewStatus = rec[7], OrderID = rec[8], }); } }
protected string GetNextColumn(string colname) { return(SpreadsheetReader.GetColumnName(colname, 1)); }
public bool SetWorksheet(string sheetName) { _worksheet = SpreadsheetReader.GetWorksheetPartByName(_doc, sheetName); return(_worksheet != null); }
private void LoadTiresFromReader(SpreadsheetReader reader, LoadResult result) { //проверка наличия в файле единственного листа с заказом reader.CurrentSheet = 0; int numOfFields = 9; List<RmsAuto.Store.Cms.Entities.Battery> t = new List<RmsAuto.Store.Cms.Entities.Battery>(); for (int r = 1; r < reader.RecordCount; r++) { string[] rec = new string[numOfFields]; for (int i = 0; i < numOfFields; i++) rec[i] = reader[r, i]; rec = rec.Each(s => s.Trim()).ToArray(); if (rec.All(s => s == "")) continue; if (rec.All(s => string.IsNullOrEmpty(s))) { break; } var t1 = new RmsAuto.Store.Cms.Entities.Battery(); for (int c = 0; c < numOfFields; c++) { string value = rec[c]; try { switch (c) { case 0: t1.Manufacturer = value; break; case 1: t1.ModelName = value; break; case 2: t1.PartNumber = value; break; case 3: t1.Capacity = Decimal.Parse(value); break; case 4: t1.polarity = value; break; case 5: t1.cleat = value; break; case 6: t1.Size = value; break; } } catch { //TODO допилить обработку ошибок } } t.Add(t1); } using (CmsDataContext cms = new CmsDataContext()) { try { cms.Connection.Open(); cms.Transaction = cms.Connection.BeginTransaction(); var current = cms.Batteries.Select(x => x).ToList(); current.Sort(new BatteryComparer()); t.Sort(new BatteryComparer()); t = t.Select(x => x).Distinct(new BatteryComparer()).ToList(); //Пробегаем по каждому объекту каталога и смотрим какая у него была картинка foreach (var RefObj in t) { var tmp = current.Where(x => x.PartNumber == RefObj.PartNumber).FirstOrDefault(); RefObj.ImageUrl = tmp != null && tmp.ImageUrl.HasValue ? tmp.ImageUrl : (int)NoPhotoID.Battery; } t = t.UnionAndDistinct<RmsAuto.Store.Cms.Entities.Battery>(current, new BatteryComparer()); cms.Batteries.DeleteAllOnSubmit(current); cms.Batteries.InsertAllOnSubmit(t); cms.SubmitChanges(ConflictMode.ContinueOnConflict); cms.Transaction.Commit(); } catch (ChangeConflictException) { //TODO допилить обработку ошибок } catch (Exception) { cms.Transaction.Rollback(); Logger.WriteError("Ошибка при сохранении результатов загрузки аккумуляторов", EventLogerID.BLException, EventLogerCategory.BLError); } finally { if (cms.Connection.State == System.Data.ConnectionState.Open) { cms.Connection.Close(); } } } }
private void ReadTables(CremaDataSet dataSet, IDataBase dataBase, string filename, string itemNames) { var sheetNames = SpreadsheetReader.ReadSheetNames(filename); var tableInfos = dataBase.Dispatcher.Invoke(() => { var query = from table in dataBase.TableContext.Tables let tableName2 = SpreadsheetUtility.Ellipsis(table.Name) join sheetName in sheetNames on tableName2 equals sheetName where table.Name.GlobMany(itemNames) || table.Path.GlobMany(itemNames) orderby table.Name select table.TableInfo; return(query.ToArray()); }); var typeInfos = dataBase.Dispatcher.Invoke(() => { var query = from table in dataBase.TableContext.Tables let tableName2 = SpreadsheetUtility.Ellipsis(table.Name) join sheetName in sheetNames on tableName2 equals sheetName where table.Name.GlobMany(itemNames) || table.Path.GlobMany(itemNames) from column in table.TableInfo.Columns where CremaDataTypeUtility.IsBaseType(column.DataType) == false let type = dataBase.TypeContext[column.DataType] as IType where type != null select type.TypeInfo; return(query.Distinct().ToArray()); }); foreach (var item in typeInfos) { dataSet.Types.Add(item); } foreach (var item in tableInfos) { if (item.TemplatedParent != string.Empty) { continue; } if (item.ParentName == string.Empty) { dataSet.Tables.Add(item); } else { dataSet.Tables[item.ParentName].Childs.Add(item); } } foreach (var item in tableInfos) { if (item.TemplatedParent != string.Empty && item.ParentName == string.Empty) { var dataTable = dataSet.Tables[item.TemplatedParent]; dataTable.Inherit(item.TableName); } } var progress = new ConsoleProgress(this.Out) { Style = ConsoleProgressStyle.None }; using (var reader = new SpreadsheetReader(filename)) { reader.Read(dataSet, progress); } }
public void Read(CremaDataSet dataSet) { using var reader = new SpreadsheetReader(this.Path); reader.Read(dataSet); }