diff --git a/RhSolutions.AddIn/AddIn/RhSolutionsAddIn.cs b/RhSolutions.AddIn/AddIn/RhSolutionsAddIn.cs index f7a6c69..b7634a9 100644 --- a/RhSolutions.AddIn/AddIn/RhSolutionsAddIn.cs +++ b/RhSolutions.AddIn/AddIn/RhSolutionsAddIn.cs @@ -1,6 +1,5 @@ using System.Net; using ExcelDna.IntelliSense; -using Microsoft.Office.Interop.Excel; #if !NET472 using System.Runtime.Versioning; #endif diff --git a/RhSolutions.AddIn/Controllers/RibbonController.cs b/RhSolutions.AddIn/Controllers/RibbonController.cs index 1d8a8f7..6d234e8 100644 --- a/RhSolutions.AddIn/Controllers/RibbonController.cs +++ b/RhSolutions.AddIn/Controllers/RibbonController.cs @@ -119,8 +119,8 @@ public class RibbonController : ExcelRibbon else { - WorksheetValidator.Validate(RhSolutionsAddIn.Excel.ActiveSheet); - _workbookIsValid = WorksheetValidator.IsValid(); + Worksheet worksheet = RhSolutionsAddIn.Excel.ActiveWorkbook.ActiveSheet; + _workbookIsValid = worksheet.IsValidSource(); } } } diff --git a/RhSolutions.AddIn/Services/ExcelReader.cs b/RhSolutions.AddIn/Services/ExcelReader.cs index 785d66b..540c00a 100644 --- a/RhSolutions.AddIn/Services/ExcelReader.cs +++ b/RhSolutions.AddIn/Services/ExcelReader.cs @@ -85,7 +85,7 @@ public class ExcelReader : IReader, IDisposable List<(string, Dictionary)> result = new(); foreach (Worksheet worksheet in worksheets) { - if (!WorksheetValidator.IsValid()) + if (!worksheet.IsValidSource()) { continue; } @@ -93,11 +93,12 @@ public class ExcelReader : IReader, IDisposable string wbName = Path.GetFileNameWithoutExtension( worksheet.Parent.Name); - Range amountCell = WorksheetValidator.HeaderCells["Amount"], - skuCell = WorksheetValidator.HeaderCells["Sku"], - productLineCell = WorksheetValidator.HeaderCells["ProductLine"], - nameCell = WorksheetValidator.HeaderCells["Name"], - measureCell = WorksheetValidator.HeaderCells["Measure"]; + Range amountCell = worksheet.Cells.Find(headers["Amount"]); + Range headerRow = amountCell.EntireRow; + Range skuCell = headerRow.Find(headers["Sku"]), + productLineCell = headerRow.Find(headers["ProductLine"]), + nameCell = headerRow.Find(headers["Name"]), + measureCell = headerRow.Find(headers["Measure"]); var lastRowIndex = worksheet.Cells[worksheet.Rows.Count, skuCell.Column] .End[XlDirection.xlUp].Row; diff --git a/RhSolutions.AddIn/Services/ExcelWriterBase.cs b/RhSolutions.AddIn/Services/ExcelWriterBase.cs index 70b4823..3ec5348 100644 --- a/RhSolutions.AddIn/Services/ExcelWriterBase.cs +++ b/RhSolutions.AddIn/Services/ExcelWriterBase.cs @@ -31,7 +31,7 @@ namespace RhSolutions.Services public void WriteProducts(IEnumerable<(string, Dictionary)> products) { - if (!WorksheetValidator.IsValid()) + if (!_worksheet.IsValidSource()) { _application.ActiveWorkbook.Close(); throw new ArgumentException( @@ -40,11 +40,11 @@ namespace RhSolutions.Services ShowFilteredData(); - _amountCell = WorksheetValidator.HeaderCells["Amount"]; - _skuCell = WorksheetValidator.HeaderCells["Sku"]; - _programLineCell = WorksheetValidator.HeaderCells["ProductLine"]; - _nameCell = WorksheetValidator.HeaderCells["Name"]; - _oldSkuCell = WorksheetValidator.HeaderCells["OldSku"]; + _amountCell = _worksheet.Cells.Find(_headers["Amount"]); + _skuCell = _worksheet.Cells.Find(_headers["Sku"]); + _programLineCell = _worksheet.Cells.Find(_headers["ProductLine"]); + _nameCell = _worksheet.Cells.Find(_headers["Name"]); + _oldSkuCell = _worksheet.Cells.Find(_headers["OldSku"]); _progressBar = new("Заполняю строки...", products .Select(p => p.Item2) diff --git a/RhSolutions.AddIn/Services/WorksheetValidator.cs b/RhSolutions.AddIn/Services/WorksheetValidator.cs deleted file mode 100644 index 557bfc0..0000000 --- a/RhSolutions.AddIn/Services/WorksheetValidator.cs +++ /dev/null @@ -1,50 +0,0 @@ -#if !NET472 -using System.Runtime.Versioning; -#endif - -namespace RhSolutions.Services; - -public static class WorksheetValidator -{ - public static Dictionary HeaderCells { get; private set; } - - public static void Validate(this Worksheet worksheet) - { - Range headerRow = null; - HeaderCells = new(); - var headers = RhSolutionsAddIn.Configuration.GetPriceListHeaders(); - - foreach (var kvp in headers) - { - Range cell; - - if (headerRow == null) - { - cell = worksheet.Cells.Find(kvp.Value); - if (cell == null) - { - continue; - } - headerRow = cell.EntireRow; - } - else - { - cell = headerRow.Cells.Find(kvp.Value); - } - - if (HeaderCells.ContainsKey(kvp.Key)) - { - HeaderCells[kvp.Key] = cell; - } - else - { - HeaderCells.Add(kvp.Key, cell); - } - } - } - - public static bool IsValid() - { - return HeaderCells.Count >= RhSolutionsAddIn.Configuration.GetPriceListHeaders().Count - 1; - } -} diff --git a/RhSolutions.AddIn/Tools/WorksheetExtensions.cs b/RhSolutions.AddIn/Tools/WorksheetExtensions.cs index 62fff71..ee2fcdf 100644 --- a/RhSolutions.AddIn/Tools/WorksheetExtensions.cs +++ b/RhSolutions.AddIn/Tools/WorksheetExtensions.cs @@ -9,6 +9,39 @@ namespace RhSolutions.Tools; #endif public static class WorksheetExtensions { + private static readonly Dictionary pricelistParameters = + RhSolutionsAddIn.Configuration.GetPriceListHeaders(); + + public static bool IsValidSource(this Worksheet worksheet) + { + Range headerRow; + + string[] fields = pricelistParameters.Values + .Where(v => v != "Прежний материал") + .ToArray(); + + var value = worksheet.Cells.Find(fields[0]); + + if (value == null) + { + return false; + } + else + { + headerRow = value.EntireRow; + } + + for (int i = 1; i < fields.Length; i++) + { + if (headerRow.Find(fields[i]) == null) + { + return false; + } + } + + return true; + } + public static void AddValue(this Range range, double value) { if (range.Value2 == null) diff --git a/RhSolutions.Tests/CanDoGuess.cs b/RhSolutions.Tests/CanDoGuess.cs index a0ac882..a43c92e 100644 --- a/RhSolutions.Tests/CanDoGuess.cs +++ b/RhSolutions.Tests/CanDoGuess.cs @@ -23,13 +23,11 @@ public class CanDoGuess : IDisposable public void CanWriteMultiplyRows() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecificationGuess.xlsx")); var products = _guessReader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); var targetProducts = _reader.ReadProducts(new[] { targetSheet }); Assert.Equal("TestSpecificationGuess", products.First().Item1); @@ -42,13 +40,11 @@ public class CanDoGuess : IDisposable public void CanWriteOneRow() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecificationGuessOneRow.xlsx")); var products = _guessReader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); var targetProducts = _reader.ReadProducts(new[] { targetSheet }); Assert.Equal("TestSpecificationGuessOneRow", products.First().Item1); diff --git a/RhSolutions.Tests/CanFillSleeves.cs b/RhSolutions.Tests/CanFillSleeves.cs index aa0aa5d..aedad09 100644 --- a/RhSolutions.Tests/CanFillSleeves.cs +++ b/RhSolutions.Tests/CanFillSleeves.cs @@ -24,7 +24,6 @@ public class CanFillSleeves : IDisposable [ExcelFact(Workbook = @"..\..\..\TestWorkbooks\TestSpecificationSleeves.xlsx")] public void CanCalculateSleeves() { - _worksheet.Validate(); var products = _reader.ReadProducts(new[] { _worksheet }); var sleeves = _calculator.CalculateSleeves(products.First().Item2); _writer.WriteProducts(sleeves); diff --git a/RhSolutions.Tests/CanReadProducts.cs b/RhSolutions.Tests/CanReadProducts.cs index 745c243..e796da0 100644 --- a/RhSolutions.Tests/CanReadProducts.cs +++ b/RhSolutions.Tests/CanReadProducts.cs @@ -22,7 +22,6 @@ public class CanReadProducts : IDisposable public void CanReadRange() { Worksheet worksheet = _testWorkbook.Sheets[1]; - worksheet.Validate(); worksheet.Range["A1"].Value = "11600011001"; worksheet.Range["A2"].Value = "11600011001"; worksheet.Range["A3"].Value = "160002-001"; @@ -50,7 +49,6 @@ public class CanReadProducts : IDisposable public void CanReadWorkbook() { Worksheet worksheet = Util.Workbook.Worksheets[1]; - worksheet.Validate(); var result = _reader.ReadProducts(new[] { worksheet }); Assert.NotNull(result); Assert.NotEmpty(result); diff --git a/RhSolutions.Tests/CanWriteProducts.cs b/RhSolutions.Tests/CanWriteProducts.cs index 7c72903..50ce662 100644 --- a/RhSolutions.Tests/CanWriteProducts.cs +++ b/RhSolutions.Tests/CanWriteProducts.cs @@ -21,13 +21,11 @@ public class CanWriteProducts : IDisposable public void CanWriteSingle() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecification.xlsx")); var products = _reader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); var targetProducts = _reader.ReadProducts(new[] { targetSheet }); Assert.Equal("TestSpecification", products.First().Item1); @@ -40,13 +38,11 @@ public class CanWriteProducts : IDisposable public void CanWriteMultipleProductLines() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecificationMultipleProductLines.xlsx")); var products = _reader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); var targetProducts = _reader.ReadProducts(new[] { targetSheet }); Assert.Equal("TestSpecificationMultipleProductLines", products.First().Item1); @@ -59,13 +55,11 @@ public class CanWriteProducts : IDisposable public void CanWriteNotFound() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecificationNotFound.xlsx")); var products = _reader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); Assert.Equal("???", targetSheet.Range["B4"].Value2); Assert.Contains("Молот Тора", targetSheet.Range["C4"].Value2); @@ -76,13 +70,11 @@ public class CanWriteProducts : IDisposable public void CanWriteReplaced() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecificationReplaced.xlsx")); var products = _reader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); var targetProducts = _reader.ReadProducts(new[] { targetSheet }); Assert.Equal("TestSpecificationReplaced", products.First().Item1); @@ -100,13 +92,11 @@ public class CanWriteProducts : IDisposable public void CanWriteNewVariant() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\TargetSpecificationNewVariant.xlsx")); var products = _reader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); var targetProducts = _reader.ReadProducts(new[] { targetSheet }); Assert.Equal("TestSpecificationNewVariant", products.First().Item1); diff --git a/RhSolutions.Tests/RealPricelistTest.cs b/RhSolutions.Tests/RealPricelistTest.cs index cb99908..9ff3a25 100644 --- a/RhSolutions.Tests/RealPricelistTest.cs +++ b/RhSolutions.Tests/RealPricelistTest.cs @@ -21,13 +21,11 @@ public class RealPricelistTest : IDisposable public void CanWrite() { Worksheet sourceSheet = Util.Workbook.Worksheets[1]; - sourceSheet.Validate(); RhSolutionsAddIn.Configuration.SetPriceListPath(Path.GetFullPath(@"..\..\..\TestWorkbooks\RealTargetSpecification.xlsx")); var products = _reader.ReadProducts(new[] { sourceSheet }); var _writer = new NewPriceWriter(Util.Application, RhSolutionsAddIn.Configuration); _writer.WriteProducts(products); Worksheet targetSheet = Util.Application.ActiveWindow.ActiveSheet; - targetSheet.Validate(); targetSheet.Range["A1"].Formula = "=SUM(H:H)"; Assert.Equal("RealTestSpecification", products.First().Item1); diff --git a/RhSolutions.Tests/WorkbookValidationTests.cs b/RhSolutions.Tests/WorkbookValidationTests.cs index 5a6700a..f5b338a 100644 --- a/RhSolutions.Tests/WorkbookValidationTests.cs +++ b/RhSolutions.Tests/WorkbookValidationTests.cs @@ -1,4 +1,5 @@ using RhSolutions.AddIn; +using RhSolutions.Tools; namespace RhSolutions.Tests; @@ -17,17 +18,15 @@ public class WorkbookValidationTests : IDisposable [ExcelFact(Workbook = @"..\..\..\TestWorkbooks\EmptyTestTable.xlsx")] public void WorksheetIsCorrect() { - Worksheet ws = Util.Workbook.Sheets[1]; - ws.Validate(); - Assert.True(WorksheetValidator.IsValid()); + Worksheet worksheet = Util.Workbook.Sheets[1]; + Assert.True(worksheet.IsValidSource()); } [ExcelFact(Workbook = @"..\..\..\TestWorkbooks\EmptyWorkbook.xlsx")] public void EmptyWorkbookIsNotCorrect() { - Worksheet ws = Util.Workbook.Sheets[1]; - ws.Validate(); - Assert.False(WorksheetValidator.IsValid()); + Worksheet worksheet = Util.Workbook.Sheets[1]; + Assert.False(worksheet.IsValidSource()); } public void Dispose()