public static Task <RegistrySDSP> Parse(string fileName) { RegistrySDSP sdsp = new RegistrySDSP(); TaskCompletionSource <RegistrySDSP> tcs = new TaskCompletionSource <RegistrySDSP>(); ThreadStart listenThread = delegate() { try { ExcelXmlWorkbook book = ExcelXmlWorkbook.Import("data.xml"); var r = book.SheetCount; Worksheet sheet = book[0]; int columnCount = sheet.ColumnCount; if (columnCount <= 0) { throw new InvalidDataException("В рабочем листе недопустимое количество колонок."); } int rowCount = sheet.RowCount; if (rowCount <= 3) { throw new InvalidDataException("В рабочем листе недопустимое количество строк."); } String departament = null; RegistryCollector collector = null; // количество счётчиков очередной системы int collectorMetersCount = 0; // количество счётчиков для обработки int countMetersToParse = 0; #region парсер // пропускаем название таблицы и шапку таблицы for (int rowIndex = 2; rowIndex < sheet.RowCount; rowIndex++) { Row row = sheet[rowIndex]; int cellCount = row.CellCount; // имеются ли данные в строке bool hasData = false; for (int colIndex = 0; colIndex < row.CellCount; colIndex++) { if (!row[colIndex].IsEmpty()) { hasData = true; break; } } if (hasData == false) { continue; } // первая ячейка в строке, это не первая ячейка в строке листа EXCEL ! Cell firstCell = row[0]; ContentType meterNameCellContentType = row[4].ContentType; // если это какая-то категория if (firstCell.ContentType == ContentType.None & meterNameCellContentType == ContentType.None) { // если это новая - добавляем предыдущую в список if (departament != null) { sdsp.Departaments.Add(departament); } departament = String.Empty; StringBuilder data = new StringBuilder(); for (int i = 0; i < row.CellCount; i++) { if (row[i].ContentType == ContentType.String) { data.Append(row[i].Value); } } departament = data.ToString(); } // тогда если это данные else { if (meterNameCellContentType == ContentType.UnresolvedValue) { U.L(LogLevel.Error, "EDITOR PARSER", String.Format("Не обнаружены данные:\nНомер строки таблицы {0}", rowIndex)); throw new InvalidDataException("Не обнаружены данные."); } if (meterNameCellContentType == ContentType.String) { RegistryCounter counter = new RegistryCounter(); // имеется более одного счётчика? collectorMetersCount = firstCell.RowSpan; if (collectorMetersCount > 1) { countMetersToParse = collectorMetersCount; } // если значение в первом столбце имеется и является числовым значением if (firstCell.ContentType == ContentType.Number) { collector = new RegistryCollector(); try { // номер по-порядку collector.NumberOfOrder = row[0].GetValue <uint>(); // фидер collector.House = row[1].Value == null ? "<???>" : row[1].GetValue <string>(); // тип модема collector.ModemType = row[2].Value == null ? "<???>" : row[2].GetValue <string>(); // номер gsm collector.GsmNumber = row[3].Value == null ? "<???>" : row[3].Value.ToString(); // место установки collector.Street = row[10].Value == null ? "<???>" : row[10].GetValue <string>(); // примечание и номер договора if (row[11].ContentType == ContentType.String) { collector.Description += "Договор №" + Environment.NewLine + row[11].GetValue <string>(); } collector.Description += row[12].GetValue <string>(); collector.Departament = departament; //collector.CreationDate = row[13].Value == null ? "<?>" : row[13].GetValue<string>(); } catch (Exception ex) { var s = ex.Message; } } try { // присоединение counter.Name = row[4].Value == null ? "<???>" : row[4].GetValue <string>(); // состояние // сетевой адрес counter.NetworkAddress = row[6].Value == null ? "<???>" : row[6].Value.ToString(); // тип счётчика counter.CounterType = row[7].Value == null ? "<???>" : row[7].GetValue <string>(); // номер счётчика counter.Number = row[8].Value == null ? "<???>" : row[8].Value.ToString(); // количество тарифов counter.TarifsCount = row[9].Value == null ? (byte)0 : row[9].GetValue <byte>(); } catch (Exception ex) { var s = ex.Message; } // countMetersToParse--; if (collector == null) { System.Diagnostics.Debugger.Break(); } if (collector.Counters == null) { System.Diagnostics.Debugger.Break(); } if (counter == null) { System.Diagnostics.Debugger.Break(); } collector.Counters.Add(counter); if (countMetersToParse == 0) { sdsp.Collectors.Add(collector); collector = null; } } } } #endregion tcs.TrySetResult(sdsp); } catch (Exception e) { U.L(LogLevel.Error, "EDITOR", "Ошибка при импорте данных."); U.L(LogLevel.Error, "EDITOR", e.Message); } }; Thread l_thread = new Thread(listenThread); l_thread.Name = "Import data thread"; l_thread.Priority = ThreadPriority.Highest; l_thread.Start(); return(tcs.Task); }
private void ProcessExcel() { var isNativeFormat = true; Workbook book = null; // Open native excel file format try { book = Workbook.getWorkbook(_fullPath); } catch (Exception) { isNativeFormat = false; } try { if (isNativeFormat) { var worksheet = book.getSheet(0); const int intRegHead = 1; if (worksheet.getColumn(1).Length > 0 && chboxDisableProducts.Checked) { ProductService.DisableAllProducts(); } ImportStatistic.TotalRow = worksheet.getColumn(1).Length - 1; // Step by rows for (int i = intRegHead; i <= worksheet.getColumn(1).Length - 1; i++) { if (!ImportStatistic.IsRun) { return; } var artNo = Convert.ToString(worksheet.getCell(0, i).Value); var product = ProductService.GetProduct(artNo); var name = Convert.ToString(worksheet.getCell(1, i).Value); if (!string.IsNullOrEmpty(name)) { product.Name = name; } else { LogInvalidData(name, 1, i); continue; } string enabled = Convert.ToString(worksheet.getCell(4, i).Value); product.Enabled = !string.IsNullOrEmpty(enabled) && enabled.Trim().Equals("+"); var discount = Convert.ToString(worksheet.getCell(9, i).Value); try { product.Discount = (string.IsNullOrEmpty(discount)) ? 0 : (Convert.ToDecimal(discount)); } catch (Exception) { LogInvalidData(discount, 9, i); continue; } var weight = Convert.ToString(worksheet.getCell(11, i).Value); try { product.Weight = (string.IsNullOrEmpty(weight)) ? 0 : (Convert.ToDecimal(weight)); } catch (Exception) { LogInvalidData(weight, 11, i); continue; } product.Size = GetSizeForBdFormat(Convert.ToString(worksheet.getCell(12, i).Value)); product.BriefDescription = Convert.ToString(worksheet.getCell(13, i).Value); product.Description = Convert.ToString(worksheet.getCell(14, i).Value); var offr = new Offer { OfferListId = CatalogService.DefaultOfferListId }; var price = Convert.ToString(worksheet.getCell(5, i).Value); try { offr.Price = (string.IsNullOrEmpty(price)) ? 0 : Convert.ToDecimal(price); } catch (Exception) { LogInvalidData(price, 5, i); continue; } var sypplyprice = Convert.ToString(worksheet.getCell(6, i).Value); try { offr.SupplyPrice = (string.IsNullOrEmpty(sypplyprice)) ? 0 : Convert.ToDecimal(sypplyprice); } catch (Exception) { LogInvalidData(sypplyprice, 6, i); continue; } var shippingPrice = Convert.ToString(worksheet.getCell(10, i).Value); try { offr.ShippingPrice = (string.IsNullOrEmpty(shippingPrice)) ? 0 : (Convert.ToDecimal(shippingPrice)); } catch (Exception) { LogInvalidData(shippingPrice, 10, i); continue; } var amount = Convert.ToString(worksheet.getCell(7, i).Value); try { offr.Amount = (string.IsNullOrEmpty(amount)) ? 0 : (Convert.ToInt32(amount)); } catch (Exception) { LogInvalidData(amount, 7, i); continue; } offr.Unit = Convert.ToString(worksheet.getCell(8, i).Value); product.Offers = new List <Offer> { offr }; string rewurl = Convert.ToString(worksheet.getCell(2, i).Value); //var synonym = (string.IsNullOrEmpty(rewurl)) ? product.ArtNo : rewurl; //product.Synonym = synonym; // --- New Fix Code - XML if (string.IsNullOrEmpty(rewurl)) // пустая строка { rewurl = product.ArtNo; } else { // Не пустая строка, Используется или нет этот синомим вообще ? int productId = ProductService.GetProductId(product.ArtNo); if (!UrlService.IsAvalibleUrl(productId, ParamType.Product, rewurl)) // RouteService.GetParamBySynonym(rewurl) != null { //TODO не компилится // Ок, Используется, не у нашего ли товара? //UrlSynonym synonym = RouteService.GetUrlSynonymByParamValue(productId, ParamType.Product); //if (synonym != null && synonym.Synonym != rewurl) //{ // // Нет не унашего. Значит он занят, чтобы небыло дубликата, // // ставим Артикул как синоним // rewurl = product.ArtNo; //} } } product.UrlPath = rewurl; UpdateInsertProduct(product); //if (string.IsNullOrEmpty(rewurl) || RouteService.GetParamBySynonym(rewurl) != null) rewurl = product.ArtNo; //RouteService.UpdateParamSynonym(ParamType.Product, product.ProductId, //RouteService.InsertUpdateParam(rewurl, ParamType.Product, product.ProductId.ToString()); var parentCategory = Convert.ToString(worksheet.getCell(3, i).Value); if (!string.IsNullOrEmpty(parentCategory)) { try { CategoryService.SubParseAndCreateCategory(parentCategory, product.ProductId); } catch (Exception) { LogInvalidData(parentCategory, 3, i); } } else { continue; } } } else { ExcelXmlWorkbook xmlbook = ExcelXmlWorkbook.Import(_fullPath); Worksheet xmlsheet = xmlbook[0]; const int intRegHead = 1; if (xmlsheet.RowCount > 0 && chboxDisableProducts.Checked) { ProductService.DisableAllProducts(); } ImportStatistic.TotalRow = xmlsheet.RowCount - 1; // Step by rows for (int i = intRegHead; i <= xmlsheet.RowCount - 1; i++) { if (!ImportStatistic.IsRun) { return; } var artNo = Convert.ToString(xmlsheet[0, i].Value); var product = ProductService.GetProduct(artNo); var name = Convert.ToString(xmlsheet[1, i].Value); if (!string.IsNullOrEmpty(name)) { product.Name = name; } else { LogInvalidData(name, 1, i); continue; } var enabled = Convert.ToString(xmlsheet[4, i].Value); product.Enabled = !string.IsNullOrEmpty(enabled) && enabled.Trim().Equals("+"); var discount = Convert.ToString(xmlsheet[9, i].Value); try { product.Discount = (string.IsNullOrEmpty(discount)) ? 0 : (Convert.ToDecimal(discount)); } catch (Exception) { LogInvalidData(discount, 9, i); continue; } var weight = Convert.ToString(xmlsheet[11, i].Value); try { product.Weight = (string.IsNullOrEmpty(weight)) ? 0 : Convert.ToDecimal(weight); } catch (Exception) { LogInvalidData(weight, 11, i); continue; } product.Size = GetSizeForBdFormat(Convert.ToString(xmlsheet[12, i].Value)); product.BriefDescription = Convert.ToString(xmlsheet[13, i].Value); product.Description = Convert.ToString(xmlsheet[14, i].Value); var offr = new Offer { OfferListId = CatalogService.DefaultOfferListId }; var price = Convert.ToString(xmlsheet[5, i].Value); try { offr.Price = (string.IsNullOrEmpty(price)) ? 0 : Convert.ToDecimal(price); } catch (Exception) { LogInvalidData(price, 5, i); continue; } var supplyPrice = Convert.ToString(xmlsheet[6, i].Value); try { offr.SupplyPrice = (string.IsNullOrEmpty(supplyPrice)) ? 0 : Convert.ToDecimal(supplyPrice); } catch (Exception) { LogInvalidData(supplyPrice, 6, i); continue; } var shippingPrice = Convert.ToString(xmlsheet[10, i].Value); try { offr.ShippingPrice = (string.IsNullOrEmpty(shippingPrice)) ? 0 : (Convert.ToDecimal(shippingPrice)); } catch (Exception) { LogInvalidData(shippingPrice, 10, i); continue; } var amount = Convert.ToString(xmlsheet[7, i].Value); try { offr.Amount = (string.IsNullOrEmpty(amount)) ? 0 : Convert.ToInt32(amount); } catch (Exception) { LogInvalidData(amount, 7, i); continue; } offr.Unit = Convert.ToString(xmlsheet[8, i].Value); product.Offers = new List <Offer> { offr }; string rewurl = Convert.ToString(xmlsheet[2, i].Value); //string synonym = (string.IsNullOrEmpty(rewurl)) ? product.ArtNo : rewurl; //product.Synonym = synonym; // Todo // --- New Fix Code - XML if (string.IsNullOrEmpty(rewurl)) // пустая строка { rewurl = product.ArtNo; } else { // Не пустая строка, Используется или нет этот синомим вообще ? int productId = ProductService.GetProductId(product.ArtNo); if (!UrlService.IsAvalibleUrl(productId, ParamType.Product, rewurl)) // RouteService.GetParamBySynonym(rewurl) != null { //TODO не компилится // Ок, Используется, не у нашего ли товара? //UrlSynonym synonym = RouteService.GetUrlSynonymByParamValue(productId, ParamType.Product); //if (synonym != null && synonym.Synonym != rewurl) //{ // // Нет не унашего. Значит он занят, чтобы небыло дубликата, // // ставим Артикул как синоним // rewurl = product.ArtNo; //} } } product.UrlPath = rewurl; UpdateInsertProduct(product); //RouteService.UpdateParamSynonym(ParamType.Product, product.ProductId, synonym); //if (string.IsNullOrEmpty(rewurl) || RouteService.GetParamBySynonym(rewurl) != null) rewurl = product.ArtNo; //RouteService.InsertUpdateParam(rewurl, ParamType.Product, product.ProductId.ToString()); var parentCategory = Convert.ToString(xmlsheet[3, i].Value); if (string.IsNullOrEmpty(parentCategory)) { continue; } try { CategoryService.SubParseAndCreateCategory(parentCategory, product.ProductId); } catch { LogInvalidData(parentCategory, 3, i); //TODO: vk: тут надо бы вывести сообщение о том, что продукт уже есть в категории. или изменить try/catch блок на проверку существования продукта в категории //наличие exception`ов здесь - нормально } } } CategoryService.RecalculateProductsCountManual(); //TODO find where is this function! //ProductService.SumImportLog(Resource.Admin_ImportXLS_UpdoadingSuccessfullyCompleted,Resource.Admin_ImportXLS_UpdoadingCompletedWithErrors); } catch (Exception ex) { MsgErr(ex.Message + " at xls"); Debug.LogError(ex); } ImportStatistic.IsRun = false; //ImportStatistic.ThreadImport.Abort(); }