From f01228d94554669146137dea9614d87df22c01f3 Mon Sep 17 00:00:00 2001 From: Sergey Chebotar Date: Fri, 31 Mar 2023 15:27:31 +0300 Subject: [PATCH] Add Excel Table classes --- RhSolutions.AddIn/ExcelTable/ExcelColumn.cs | 47 +++++++++++++ .../ExcelTable/ExcelColumnEnumerator.cs | 54 +++++++++++++++ RhSolutions.AddIn/ExcelTable/ExcelColumns.cs | 39 +++++++++++ .../ExcelTable/ExcelColumnsEnumerator.cs | 54 +++++++++++++++ RhSolutions.AddIn/ExcelTable/ExcelRow.cs | 33 +++++++++ .../ExcelTable/ExcelRowEnumerator.cs | 54 +++++++++++++++ RhSolutions.AddIn/ExcelTable/ExcelRows.cs | 39 +++++++++++ .../ExcelTable/ExcelRowsEnumerator.cs | 55 +++++++++++++++ RhSolutions.AddIn/ExcelTable/ExcelTable.cs | 53 ++++++++++++++ .../ExcelTable/ExcelTableCell.cs | 24 +++++++ RhSolutions.AddIn/RhSolutions.AddIn.csproj | 2 +- RhSolutions.Tests/ExcelTablesTests.cs | 65 ++++++++++++++++++ RhSolutions.Tests/RhSolutions.Tests.csproj | 3 + .../TestWorkbooks/ExcelTableTest.xlsx | Bin 0 -> 8987 bytes RhSolutions.Tests/Usings.cs | 2 +- ...heckTest.cs => WorkbookValidationTests.cs} | 10 +-- 16 files changed, 527 insertions(+), 7 deletions(-) create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelColumn.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelColumnEnumerator.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelColumns.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelColumnsEnumerator.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelRow.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelRowEnumerator.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelRows.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelRowsEnumerator.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelTable.cs create mode 100644 RhSolutions.AddIn/ExcelTable/ExcelTableCell.cs create mode 100644 RhSolutions.Tests/ExcelTablesTests.cs create mode 100644 RhSolutions.Tests/TestWorkbooks/ExcelTableTest.xlsx rename RhSolutions.Tests/{RhSolutionsCheckTest.cs => WorkbookValidationTests.cs} (72%) diff --git a/RhSolutions.AddIn/ExcelTable/ExcelColumn.cs b/RhSolutions.AddIn/ExcelTable/ExcelColumn.cs new file mode 100644 index 0000000..7d72cd5 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelColumn.cs @@ -0,0 +1,47 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public sealed class ExcelColumn : ExcelTable, IEnumerable +{ + public string Header + { + get => Range.Cells[1, 1].Value.ToString(); + } + public int Index + { + get => Range.Column - ParentTable.Range.Column; + } + public int Length + { + get => Range.Rows.Count; + } + + public ExcelColumn(Range range, ExcelTable table) : base(range, table) + { + Range = range; + ParentTable = table; + } + + public ExcelTableCell this[int index] + { + get => new(Range.Cells[index + 1, 1], ParentTable); + } + + public IEnumerator GetEnumerator() + { + return new ExcelColumnEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + + public ExcelColumn AddLeft() + { + Range.EntireColumn + .Insert(XlInsertShiftDirection.xlShiftToRight, + XlInsertFormatOrigin.xlFormatFromRightOrBelow); + + return ParentTable.Columns[this.Index - 1]; + } +} diff --git a/RhSolutions.AddIn/ExcelTable/ExcelColumnEnumerator.cs b/RhSolutions.AddIn/ExcelTable/ExcelColumnEnumerator.cs new file mode 100644 index 0000000..c809c18 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelColumnEnumerator.cs @@ -0,0 +1,54 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public class ExcelColumnEnumerator : IEnumerator +{ + public Range Range { get; } + public ExcelTable ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public ExcelTableCell Current + { + get + { + try + { + return new ExcelTableCell(Range.Cells[position, 1], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public ExcelColumnEnumerator(Range range, ExcelTable table) + { + Range = range; + ParentTable = table; + } + + public bool MoveNext() + { + position++; + return (position <= Range.Rows.Count); + } + + public void Reset() + { + position = 0; + } + + public void Dispose() + { + + } +} diff --git a/RhSolutions.AddIn/ExcelTable/ExcelColumns.cs b/RhSolutions.AddIn/ExcelTable/ExcelColumns.cs new file mode 100644 index 0000000..4aacd6f --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelColumns.cs @@ -0,0 +1,39 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public class ExcelColumns : IEnumerable +{ + public Range Range { get; } + public ExcelTable ParentTable { get; } + public int Length + { + get => Range.Columns.Count; + } + + public ExcelColumns(Range range, ExcelTable parentTable) + { + Range = range; + ParentTable = parentTable; + } + + public ExcelColumn this[int index] + { + get + { + if (index < 0 || index + 1 > Range.Columns.Count) + { + throw new IndexOutOfRangeException(); + } + + return new ExcelColumn(Range.Columns[index + 1], ParentTable); + } + } + + public IEnumerator GetEnumerator() + { + return new ExcelColumnsEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} \ No newline at end of file diff --git a/RhSolutions.AddIn/ExcelTable/ExcelColumnsEnumerator.cs b/RhSolutions.AddIn/ExcelTable/ExcelColumnsEnumerator.cs new file mode 100644 index 0000000..8c351e9 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelColumnsEnumerator.cs @@ -0,0 +1,54 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public class ExcelColumnsEnumerator: IEnumerator +{ + public Range Range { get; } + public ExcelTable ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public ExcelColumn Current + { + get + { + try + { + return new ExcelColumn(Range.Columns[position], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public ExcelColumnsEnumerator(Range range, ExcelTable table) + { + Range = range; + ParentTable = table; + } + + public bool MoveNext() + { + position++; + return (position <= Range.Columns.Count); + } + + public void Reset() + { + position = 0; + } + + public void Dispose() + { + + } +} \ No newline at end of file diff --git a/RhSolutions.AddIn/ExcelTable/ExcelRow.cs b/RhSolutions.AddIn/ExcelTable/ExcelRow.cs new file mode 100644 index 0000000..231fd7c --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelRow.cs @@ -0,0 +1,33 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public sealed class ExcelRow : ExcelTable, IEnumerable +{ + public int Index + { + get => Range.Row - ParentTable.Range.Row; + } + public int Length + { + get => Range.Columns.Count; + } + + public ExcelRow(Range range, ExcelTable table) : base(range, table) + { + Range = range; + ParentTable = table; + } + + public ExcelTableCell this[int index] + { + get => new(Range.Cells[1, index + 1], ParentTable); + } + + public IEnumerator GetEnumerator() + { + return new ExcelRowEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} diff --git a/RhSolutions.AddIn/ExcelTable/ExcelRowEnumerator.cs b/RhSolutions.AddIn/ExcelTable/ExcelRowEnumerator.cs new file mode 100644 index 0000000..58f88d8 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelRowEnumerator.cs @@ -0,0 +1,54 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public class ExcelRowEnumerator : IEnumerator +{ + public Range Range { get; } + public ExcelTable ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public ExcelTableCell Current + { + get + { + try + { + return new ExcelTableCell(Range.Cells[1, position], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public ExcelRowEnumerator(Range range, ExcelTable parentTable) + { + Range = range; + ParentTable = parentTable; + } + + public bool MoveNext() + { + position++; + return (position <= Range.Columns.Count); + } + + public void Reset() + { + position = 0; + } + + public void Dispose() + { + + } +} \ No newline at end of file diff --git a/RhSolutions.AddIn/ExcelTable/ExcelRows.cs b/RhSolutions.AddIn/ExcelTable/ExcelRows.cs new file mode 100644 index 0000000..44602f0 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelRows.cs @@ -0,0 +1,39 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public class ExcelRows : IEnumerable +{ + public Range Range { get; } + public ExcelTable ParentTable { get; } + public int Length + { + get => Range.Rows.Count; + } + + public ExcelRows(Range range, ExcelTable parentTable) + { + Range = range; + ParentTable = parentTable; + } + + public ExcelRow this[int index] + { + get + { + if (index < 0 || index + 1 > Range.Rows.Count) + { + throw new IndexOutOfRangeException(); + } + + return new ExcelRow(Range.Rows[index + 1], ParentTable); + } + } + + public IEnumerator GetEnumerator() + { + return new ExcelRowsEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} diff --git a/RhSolutions.AddIn/ExcelTable/ExcelRowsEnumerator.cs b/RhSolutions.AddIn/ExcelTable/ExcelRowsEnumerator.cs new file mode 100644 index 0000000..e5430d1 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelRowsEnumerator.cs @@ -0,0 +1,55 @@ +using System.Collections; + +namespace RhSolutions.ExcelTable; + +public class ExcelRowsEnumerator : IEnumerator +{ + public Range Range { get; } + public ExcelTable ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public ExcelRow Current + { + get + { + try + { + return new ExcelRow(Range.Rows[position], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public ExcelRowsEnumerator(Range range, ExcelTable table) + { + Range = range; + ParentTable = table; + } + + public bool MoveNext() + { + position++; + return (position <= Range.Rows.Count); + } + + public void Reset() + { + position = 0; + } + + public void Dispose() + { + + } + +} \ No newline at end of file diff --git a/RhSolutions.AddIn/ExcelTable/ExcelTable.cs b/RhSolutions.AddIn/ExcelTable/ExcelTable.cs new file mode 100644 index 0000000..2788036 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelTable.cs @@ -0,0 +1,53 @@ +namespace RhSolutions.ExcelTable; + +public class ExcelTable +{ + public Range Range { get; protected set; } + public ExcelTable ParentTable { get; protected set; } + public ExcelRows Rows { get; } + public ExcelColumns Columns { get; } + + public ExcelTable(Range range) + { + Range = range; + ParentTable = null; + Rows = new ExcelRows(Range, this); + Columns = new ExcelColumns(Range, this); + } + + public ExcelTable(Range range, ExcelTable table) + { + Range = range; + ParentTable = table; + Rows = new ExcelRows(Range, this); + Columns = new ExcelColumns(Range, this); + } + + public ExcelTableCell this[int row, int column] + { + get => new(Range.Cells[row + 1, column + 1], this); + } + + public IEnumerable Find(object item) + { + Range firstFound = Range.Find(item); + if (firstFound == null) + { + yield break; + } + + Range nextFound = firstFound; + + while (true) + { + yield return new ExcelTableCell(nextFound, ParentTable ?? this); + nextFound = Range.FindNext(nextFound); + + if (nextFound.Row == firstFound.Row + && nextFound.Column == firstFound.Column) + { + yield break; + } + } + } +} diff --git a/RhSolutions.AddIn/ExcelTable/ExcelTableCell.cs b/RhSolutions.AddIn/ExcelTable/ExcelTableCell.cs new file mode 100644 index 0000000..8f742d2 --- /dev/null +++ b/RhSolutions.AddIn/ExcelTable/ExcelTableCell.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.ExcelTable; + +public sealed class ExcelTableCell : ExcelTable +{ + public ExcelRow ParentRow + { + get => ParentTable.Rows[ParentTable.Range.Row - Range.Row]; + } + public ExcelColumn ParentColumn + { + get => ParentTable.Columns[ParentTable.Range.Column - Range.Column]; + } + public object Value + { + get => Range.Cells[1, 1].Value2; + set => Range.Cells[1, 1].Value2 = value; + } + + public ExcelTableCell(Range range, ExcelTable table) : base(range, table) + { + Range = range; + ParentTable = table; + } +} diff --git a/RhSolutions.AddIn/RhSolutions.AddIn.csproj b/RhSolutions.AddIn/RhSolutions.AddIn.csproj index 59173c5..81fcb6a 100644 --- a/RhSolutions.AddIn/RhSolutions.AddIn.csproj +++ b/RhSolutions.AddIn/RhSolutions.AddIn.csproj @@ -3,7 +3,7 @@ net472;net6.0-windows7.0 10 Library - RhSolutions.AddIn + RhSolutions RhSolutions.AddIn false true diff --git a/RhSolutions.Tests/ExcelTablesTests.cs b/RhSolutions.Tests/ExcelTablesTests.cs new file mode 100644 index 0000000..3ce71bc --- /dev/null +++ b/RhSolutions.Tests/ExcelTablesTests.cs @@ -0,0 +1,65 @@ +namespace RhSolutions.Tests; + +[ExcelTestSettings(OutOfProcess = true, Workbook = @"TestWorkbooks\ExcelTableTest.xlsx")] +public class ExcelTablesTests : IDisposable +{ + ExcelTable.ExcelTable table; + + public ExcelTablesTests() + { + Util.Application.Workbooks.Add(); + + Worksheet worksheet = Util.Workbook.Sheets[1]; + Range range = worksheet.Range["E7:G9"]; + table = new(range); + } + + [ExcelFact] + public void CanReadExcelTable() + { + Assert.Equal(3, table.Columns.Where(c => c.Header.StartsWith("Столбец")).Count()); + Assert.Equal("Столбец 1", table.Rows.First()[0].Value); + Assert.Equal("Столбец 2", table[0, 1].Value); + Assert.Equal(123d, table[1, 1].Value); + Assert.Null(table[1, 2].Value); + } + + [ExcelFact] + public void CanModifyTableCells() + { + table[2, 1].Value = 1; + table[1, 1].Value = (double)table[1, 1].Value + 123; + Assert.Equal(1d, table[2, 1].Value); + Assert.Equal(246d, table[1, 1].Value); + } + + [ExcelFact] + public void CanFindInTable() + { + table[2, 0].Value = "Find!"; + table[2, 1].Value = "Find this!"; + table[2, 2].Value = "Find that!"; + + + var cells = table.Find("Find"); + Assert.Collection(cells, item => Assert.Equal("Find!", item.Value), + item => Assert.Equal("Find this!", item.Value), + item => Assert.Equal("Find that!", item.Value)); + Assert.Equal(0, table.Find("Значение").First().ParentColumn.Index); + Assert.Equal(3, table.Rows[2].Find("Find").Count()); + Assert.Empty(table.Columns[1].Find("Пусто")); + } + + [ExcelFact] + public void CanAddColumns() + { + int originalCount = table.Columns.Count(); + table.Columns[1].AddLeft(); + Assert.Equal(originalCount + 1, table.Columns.Count()); + } + + public void Dispose() + { + Util.Application.ActiveWindow.Close(SaveChanges: false); + } +} diff --git a/RhSolutions.Tests/RhSolutions.Tests.csproj b/RhSolutions.Tests/RhSolutions.Tests.csproj index aeb9c9e..9410802 100644 --- a/RhSolutions.Tests/RhSolutions.Tests.csproj +++ b/RhSolutions.Tests/RhSolutions.Tests.csproj @@ -24,6 +24,9 @@ PreserveNewest + + PreserveNewest + diff --git a/RhSolutions.Tests/TestWorkbooks/ExcelTableTest.xlsx b/RhSolutions.Tests/TestWorkbooks/ExcelTableTest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..da4cf0bea9c64944463081f185c10da308b67d57 GIT binary patch literal 8987 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 V5ukS$06>9${GgFLnBvFL{{g{imQnx! literal 0 HcmV?d00001 diff --git a/RhSolutions.Tests/Usings.cs b/RhSolutions.Tests/Usings.cs index 74130ca..4b95659 100644 --- a/RhSolutions.Tests/Usings.cs +++ b/RhSolutions.Tests/Usings.cs @@ -1,5 +1,5 @@ global using Xunit; global using Microsoft.Office.Interop.Excel; global using ExcelDna.Testing; -global using RhSolutions.Models; +global using RhSolutions.ExcelTable; global using RhSolutions.Services; diff --git a/RhSolutions.Tests/RhSolutionsCheckTest.cs b/RhSolutions.Tests/WorkbookValidationTests.cs similarity index 72% rename from RhSolutions.Tests/RhSolutionsCheckTest.cs rename to RhSolutions.Tests/WorkbookValidationTests.cs index f4d1317..aec7139 100644 --- a/RhSolutions.Tests/RhSolutionsCheckTest.cs +++ b/RhSolutions.Tests/WorkbookValidationTests.cs @@ -1,9 +1,9 @@ namespace RhSolutions.Tests; [ExcelTestSettings(OutOfProcess = true)] -public class WorkbookCheck : IDisposable +public class WorkbookValidationTests : IDisposable { - public WorkbookCheck() + public WorkbookValidationTests() { Util.Application.Workbooks.Add(); } @@ -11,7 +11,7 @@ public class WorkbookCheck : IDisposable [ExcelFact(Workbook = @"TestWorkbooks\EmptyTestTable.xlsx")] public void WorksheetIsCorrect() { - Worksheet worksheet= Util.Workbook.Sheets[1]; + Worksheet worksheet = Util.Workbook.Sheets[1]; Assert.True(worksheet.IsRehauSource()); } @@ -24,6 +24,6 @@ public class WorkbookCheck : IDisposable public void Dispose() { - Util.Application.ActiveWorkbook.Close(SaveChanges: false); + Util.Application.ActiveWindow.Close(SaveChanges: false); } -} +} \ No newline at end of file