From 7e5020ec253df1d0d32304ba72cdaa62937bb26b Mon Sep 17 00:00:00 2001 From: Sergey Chebotar Date: Tue, 1 Feb 2022 20:32:29 +0300 Subject: [PATCH] Refactoring, Not fount table formatting etc --- src/AddIn/RegistryUtil.cs | 31 +++-- src/PriceListTools/CombineTool.cs | 6 +- src/PriceListTools/ConvertTool.cs | 6 +- src/PriceListTools/ExportTool.cs | 26 ++-- src/PriceListTools/MergeTool.cs | 7 +- src/PriceListTools/PriceListTool.cs | 209 ++++++++++++---------------- src/PriceListTools/Source.cs | 21 +-- src/PriceListTools/Target.cs | 18 ++- src/Ribbon/RibbonController.cs | 9 +- 9 files changed, 158 insertions(+), 175 deletions(-) diff --git a/src/AddIn/RegistryUtil.cs b/src/AddIn/RegistryUtil.cs index ceee2fe..3ec6f6a 100644 --- a/src/AddIn/RegistryUtil.cs +++ b/src/AddIn/RegistryUtil.cs @@ -1,8 +1,8 @@ using Microsoft.Win32; -using System.IO; using RehauSku.Forms; +using System; +using System.IO; using System.Windows.Forms; -using ExcelDna.Integration; namespace RehauSku { @@ -24,22 +24,27 @@ namespace RehauSku RootKey.Close(); } - public static bool IsPriceListPathEmpty() - { - return string.IsNullOrEmpty(priceListPath); - } - public static string PriceListPath { get { - if (IsPriceListPathEmpty() || !File.Exists(priceListPath)) + if (string.IsNullOrEmpty(priceListPath) || !File.Exists(priceListPath)) { - //MessageBox.Show("Прайс-лист отсутствует или неверный файл прайс-листа", "Укажите файл прайс-листа", MessageBoxButtons.OK, MessageBoxIcon.Warning); - string fileName = Dialog.GetFilePath(); - priceListPath = fileName; - RootKey.SetValue("PriceListPath", fileName); - return priceListPath; + DialogResult result = MessageBox.Show("Прайс-лист отсутствует или неверный файл шаблона прайс-листа. " + + "Укажите файл шаблона прайс-листа.", + "Нет файла шаблона", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + + if (result == DialogResult.OK) + { + string fileName = Dialog.GetFilePath(); + priceListPath = fileName; + RootKey.SetValue("PriceListPath", fileName); + return priceListPath; + } + + else + throw new Exception("Нет файла шаблона"); } else diff --git a/src/PriceListTools/CombineTool.cs b/src/PriceListTools/CombineTool.cs index dc0f2af..da29e4d 100644 --- a/src/PriceListTools/CombineTool.cs +++ b/src/PriceListTools/CombineTool.cs @@ -9,8 +9,6 @@ namespace RehauSku.PriceListTools public void FillTarget() { - ExcelApp.ScreenUpdating = false; - foreach (Source source in SourceFiles) { TargetFile.Sheet.Columns[TargetFile.amountCell.Column] @@ -21,11 +19,11 @@ namespace RehauSku.PriceListTools newColumnHeader.Value2 = $"{source.Name}"; newColumnHeader.WrapText = true; - FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column - 1, TargetFile.amountCell.Column); + foreach(var kvp in source.PositionAmount) + FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column - 1, TargetFile.amountCell.Column); } FilterByAmount(); - ExcelApp.ScreenUpdating = true; Forms.Dialog.SaveWorkbookAs(); } diff --git a/src/PriceListTools/ConvertTool.cs b/src/PriceListTools/ConvertTool.cs index 48e93d2..f37bfe2 100644 --- a/src/PriceListTools/ConvertTool.cs +++ b/src/PriceListTools/ConvertTool.cs @@ -26,10 +26,10 @@ namespace RehauSku.PriceListTools public void FillTarget() { - ExcelApp.ScreenUpdating = false; - FillColumnsWithDictionary(Current.PositionAmount, TargetFile.amountCell.Column); + foreach (var kvp in Current.PositionAmount) + FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column); + FilterByAmount(); - ExcelApp.ScreenUpdating = true; Forms.Dialog.SaveWorkbookAs(); } diff --git a/src/PriceListTools/ExportTool.cs b/src/PriceListTools/ExportTool.cs index 757d827..bfb3d8a 100644 --- a/src/PriceListTools/ExportTool.cs +++ b/src/PriceListTools/ExportTool.cs @@ -19,21 +19,24 @@ namespace RehauSku.PriceListTools throw new Exception("Неверный диапазон"); } } + public void FillTarget() { - ExcelApp.ScreenUpdating = false; GetSelected(); - FillColumnsWithDictionary(PositionAmount, TargetFile.amountCell.Column); + + foreach (var kvp in PositionAmount) + { + FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column); + } + FilterByAmount(); - ExcelApp.ScreenUpdating = true; Forms.Dialog.SaveWorkbookAs(); } private void GetSelected() { - object[,] cells = Selection.Value2; - Dictionary SkuAmount = new Dictionary(); + object[,] cells = Selection.Value2; PositionAmount = new Dictionary(); int rowsCount = Selection.Rows.Count; @@ -72,21 +75,18 @@ namespace RehauSku.PriceListTools continue; } - if (SkuAmount.ContainsKey(sku)) + Position position = new Position(null, sku, null); + + if (PositionAmount.ContainsKey(position)) { - SkuAmount[sku] += amount.Value; + PositionAmount[position] += amount.Value; } else { - SkuAmount.Add(sku, amount.Value); + PositionAmount.Add(position, amount.Value); } } - - foreach (var kvp in SkuAmount) - { - PositionAmount.Add(new Position(null, kvp.Key, null), kvp.Value); - } } } } diff --git a/src/PriceListTools/MergeTool.cs b/src/PriceListTools/MergeTool.cs index 0d3e8eb..e196b3a 100644 --- a/src/PriceListTools/MergeTool.cs +++ b/src/PriceListTools/MergeTool.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; namespace RehauSku.PriceListTools { @@ -9,15 +8,13 @@ namespace RehauSku.PriceListTools public void FillTarget() { - ExcelApp.ScreenUpdating = false; - foreach (Source source in SourceFiles) { - FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column); + foreach (var kvp in source.PositionAmount) + FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column); } FilterByAmount(); - ExcelApp.ScreenUpdating = true; Forms.Dialog.SaveWorkbookAs(); } diff --git a/src/PriceListTools/PriceListTool.cs b/src/PriceListTools/PriceListTool.cs index f87aa16..0a82a41 100644 --- a/src/PriceListTools/PriceListTool.cs +++ b/src/PriceListTools/PriceListTool.cs @@ -11,7 +11,6 @@ namespace RehauSku.PriceListTools { protected private Application ExcelApp = (Application)ExcelDnaUtil.Application; protected private Target TargetFile; - protected private List> Missing; public void OpenNewPrice() { @@ -34,77 +33,15 @@ namespace RehauSku.PriceListTools } } - protected private void FillColumnsWithDictionary(IEnumerable> dictionary, params int[] columns) + protected private void FillColumnsWithDictionary(KeyValuePair positionAmount, params int[] columns) { - Missing = new List>(); + int? row = GetPositionRow(positionAmount.Key.Sku, positionAmount.Key.Group, TargetFile.skuCell.Column); - foreach (var positionAmount in dictionary) + if (row != null) { - FillPositionAmountToColumns(positionAmount, columns); - } - - if (Missing.Count > 0) - { - DialogResult result = - MessageBox.Show - ($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?", - "Отсутствует позиция в конечной таблице заказов", - MessageBoxButtons.YesNo, - MessageBoxIcon.Information); - - if (result == DialogResult.Yes) + foreach (int column in columns) { - var lookUp = new List>(Missing); - - foreach (var missingPosition in lookUp) - { - TryFillVariantlessSkuToColumns(missingPosition, columns); - } - } - } - - if (Missing.Count > 0) - { - FillMissing(columns); - MessageBox.Show - ($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath}\n" + - $"Под основной таблицей составлен список не найденных артикулов", - "Отсутствует позиция в конечной таблице заказов", - MessageBoxButtons.OK, - MessageBoxIcon.Information); - } - } - - protected private void FillPositionAmountToColumns(KeyValuePair positionAmount, int[] columns) - { - Range foundCell = TargetFile.skuCell.EntireColumn.Find(positionAmount.Key.Sku); - - if (foundCell == null) - { - Missing.Add(positionAmount); - return; - } - - string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); - - while (foundCell != null && foundCellGroup != positionAmount.Key.Group) - { - if (positionAmount.Key.Group == null) break; - - foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell); - foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); - } - - if (foundCell == null) - { - Missing.Add(positionAmount); - } - - else - { - foreach (var column in columns) - { - Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column]; + Range sumCell = TargetFile.Sheet.Cells[row, column]; if (sumCell.Value2 == null) { @@ -117,81 +54,115 @@ namespace RehauSku.PriceListTools } } } - } - protected private void TryFillVariantlessSkuToColumns(KeyValuePair positionAmount, int[] columns) - { - string sku = positionAmount.Key.Sku.Substring(1, 6); - - Range foundCell = TargetFile.skuCell.EntireColumn.Find(sku); - - if (foundCell == null) + else { - return; - } + string sku = positionAmount.Key.Sku.Substring(1, 6); - string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); + row = GetPositionRow(sku, positionAmount.Key.Group, TargetFile.skuCell.Column); - while (foundCell != null && foundCellGroup != positionAmount.Key.Group) - { - if (positionAmount.Key.Group == null) break; - - foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell); - foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); - } - - if (foundCell == null) - { - return; - } - - foreach (var column in columns) - { - Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column]; - - if (sumCell.Value2 == null) + if (row != null) { - sumCell.Value2 = positionAmount.Value; + foreach (int column in columns) + { + Range amountCell = TargetFile.Sheet.Cells[row, column]; + + if (amountCell.Value2 == null) + { + amountCell.Value2 = positionAmount.Value; + } + + else + { + amountCell.Value2 += positionAmount.Value; + } + + Range oldSkuCell = TargetFile.Sheet.Cells[row, TargetFile.oldSkuCell.Column]; + oldSkuCell.Value2 = positionAmount.Key.Sku; + } } else { - sumCell.Value2 += positionAmount.Value; + FillMissing(positionAmount, columns); } } - - Missing.Remove(positionAmount); } - protected private void FillMissing(int[] columns) + protected private void FillMissing(KeyValuePair positionAmount, params int[] columns) { - int startRow = - TargetFile.Sheet.AutoFilter.Range.Row + - TargetFile.Sheet.AutoFilter.Range.Rows.Count + 5; + Range foundCell = TargetFile.oldSkuCell.EntireColumn.Find(positionAmount.Key.Sku); + int row; - for (int i = 0; i < Missing.Count; i++) + if (foundCell == null) { - Range group = TargetFile.Sheet.Cells[startRow + i, TargetFile.groupCell.Column]; - Range sku = TargetFile.Sheet.Cells[startRow + i, TargetFile.skuCell.Column]; - Range name = TargetFile.Sheet.Cells[startRow + i, TargetFile.nameCell.Column]; + row = TargetFile.Sheet.Cells[TargetFile.Sheet.Rows.Count, TargetFile.skuCell.Column] + .End[XlDirection.xlUp] + .Row + 1; - group.Value2 = Missing[i].Key.Group; - sku.Value2 = Missing[i].Key.Sku; - name.Value2 = Missing[i].Key.Name; + TargetFile.Sheet.Rows[row] + .EntireRow + .Insert(XlInsertShiftDirection.xlShiftDown, XlInsertFormatOrigin.xlFormatFromLeftOrAbove); - group.ClearFormats(); - sku.ClearFormats(); - name.ClearFormats(); + Range previous = TargetFile.Sheet.Rows[row - 1]; + Range current = TargetFile.Sheet.Rows[row]; - foreach (int column in columns) + previous.Copy(current); + current.ClearContents(); + + TargetFile.Sheet.Cells[row, TargetFile.groupCell.Column].Value2 = positionAmount.Key.Group; + TargetFile.Sheet.Cells[row, TargetFile.oldSkuCell.Column].Value2 = positionAmount.Key.Sku; + TargetFile.Sheet.Cells[row, TargetFile.nameCell.Column].Value2 = positionAmount.Key.Name; + TargetFile.Sheet.Cells[row, TargetFile.skuCell.Column].Value2 = "Не найден"; + } + + else + { + row = foundCell.Row; + } + + foreach (int column in columns) + { + if (TargetFile.Sheet.Cells[row, column].Value2 == null) { - Range amount = TargetFile.Sheet.Cells[startRow + i, column]; - amount.Value2 = Missing[i].Value; - amount.ClearFormats(); + TargetFile.Sheet.Cells[row, column].Value2 = positionAmount.Value; + } + + else + { + TargetFile.Sheet.Cells[row, column].Value2 += positionAmount.Value; } } } + protected private int? GetPositionRow(string sku, string group, int column) + { + int? row = null; + Range foundCell = TargetFile.Sheet.Columns[column].Find(sku); + string foundGroupValue; + + if (foundCell == null) return null; + + else + { + row = foundCell.Row; + foundGroupValue = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); + } + + if (string.IsNullOrEmpty(group) || group.Equals(foundGroupValue)) + return row; + + else + while (true) + { + foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell); + if (foundCell == null) return row; + + foundGroupValue = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); + if (group.Equals(foundGroupValue)) return foundCell.Row; + } + } + protected private void FilterByAmount() { AutoFilter filter = TargetFile.Sheet.AutoFilter; diff --git a/src/PriceListTools/Source.cs b/src/PriceListTools/Source.cs index 5013157..7cf56be 100644 --- a/src/PriceListTools/Source.cs +++ b/src/PriceListTools/Source.cs @@ -2,6 +2,7 @@ using Microsoft.Office.Interop.Excel; using System; using System.Collections.Generic; +using System.Linq; namespace RehauSku.PriceListTools { @@ -19,12 +20,15 @@ namespace RehauSku.PriceListTools Sheet = workbook.ActiveSheet; Name = workbook.Name; - amountCell = Sheet.Cells.Find(amountHeader); - skuCell = Sheet.Cells.Find(skuHeader); - groupCell = Sheet.Cells.Find(groupHeader); - nameCell = Sheet.Cells.Find(nameHeader); + Range[] cells = new [] + { + amountCell = Sheet.Cells.Find(amountHeader), + skuCell = Sheet.Cells.Find(skuHeader), + groupCell = Sheet.Cells.Find(groupHeader), + nameCell = Sheet.Cells.Find(nameHeader) + }; - if (amountCell == null || skuCell == null || groupCell == null || nameCell == null) + if (cells.Any(x => x == null)) { throw new ArgumentException($"Файл {Name} не распознан"); } @@ -38,9 +42,9 @@ namespace RehauSku.PriceListTools List sourceFiles = new List(); - ExcelApp.ScreenUpdating = false; foreach (string file in files) { + ExcelApp.ScreenUpdating = false; Workbook wb = ExcelApp.Workbooks.Open(file); try { @@ -57,8 +61,8 @@ namespace RehauSku.PriceListTools System.Windows.Forms.MessageBoxIcon.Information); wb.Close(); } + ExcelApp.ScreenUpdating = true; } - ExcelApp.ScreenUpdating = true; return sourceFiles; } @@ -67,7 +71,7 @@ namespace RehauSku.PriceListTools { PositionAmount = new Dictionary(); - for (int row = amountCell.Row + 1; row < Sheet.AutoFilter.Range.Rows.Count; row++) + for (int row = amountCell.Row + 1; row <= Sheet.Cells[Sheet.Rows.Count, amountCell.Column].End[XlDirection.xlUp].Row; row++) { object amount = Sheet.Cells[row, amountCell.Column].Value2; @@ -83,6 +87,7 @@ namespace RehauSku.PriceListTools { PositionAmount[p] += (double)amount; } + else { PositionAmount.Add(p, (double)amount); diff --git a/src/PriceListTools/Target.cs b/src/PriceListTools/Target.cs index a7e87ec..996a092 100644 --- a/src/PriceListTools/Target.cs +++ b/src/PriceListTools/Target.cs @@ -1,21 +1,29 @@ using Microsoft.Office.Interop.Excel; using System; +using System.Linq; namespace RehauSku.PriceListTools { internal class Target : PriceList { + private const string oldSkuHeader = "Прежний материал"; + public Range oldSkuCell { get; private set; } + public Target(Workbook workbook) { Sheet = workbook.ActiveSheet; Name = workbook.FullName; - amountCell = Sheet.Cells.Find(amountHeader); - skuCell = Sheet.Cells.Find(skuHeader); - groupCell = Sheet.Cells.Find(groupHeader); - nameCell = Sheet.Cells.Find(nameHeader); + Range[] cells = new[] + { + amountCell = Sheet.Cells.Find(amountHeader), + skuCell = Sheet.Cells.Find(skuHeader), + groupCell = Sheet.Cells.Find(groupHeader), + nameCell = Sheet.Cells.Find(nameHeader), + oldSkuCell = Sheet.Cells.Find(oldSkuHeader) + }; - if (amountCell == null || skuCell == null || groupCell == null || nameCell == null) + if (cells.Any(x => x == null)) { throw new ArgumentException($"Шаблон { Name } не является прайс-листом"); } diff --git a/src/Ribbon/RibbonController.cs b/src/Ribbon/RibbonController.cs index 9011a43..7a514bd 100644 --- a/src/Ribbon/RibbonController.cs +++ b/src/Ribbon/RibbonController.cs @@ -1,10 +1,9 @@ -using System.Runtime.InteropServices; -using System.Windows.Forms; -using ExcelDna.Integration.CustomUI; -using RehauSku.PriceListTools; +using ExcelDna.Integration.CustomUI; using RehauSku.Forms; +using RehauSku.PriceListTools; using System; -using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Windows.Forms; namespace RehauSku.Ribbon {