diff options
Diffstat (limited to 'RhSolutions.ExcelExtensions')
-rw-r--r-- | RhSolutions.ExcelExtensions/Column.cs | 47 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/ColumnEnumerator.cs | 54 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Columns.cs | 39 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/ColumnsEnumerator.cs | 54 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/RhSolutions.ExcelExtensions.csproj | 15 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Row.cs | 33 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/RowEnumerator.cs | 54 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Rows.cs | 39 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/RowsEnumerator.cs | 55 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Table.cs | 53 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/TableCell.cs | 24 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Usings.cs | 3 |
12 files changed, 470 insertions, 0 deletions
diff --git a/RhSolutions.ExcelExtensions/Column.cs b/RhSolutions.ExcelExtensions/Column.cs new file mode 100644 index 0000000..53a1f3d --- /dev/null +++ b/RhSolutions.ExcelExtensions/Column.cs @@ -0,0 +1,47 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public sealed class Column : Table, IEnumerable<TableCell> +{ + 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 Column(Range range, Table table) : base(range, table) + { + Range = range; + ParentTable = table; + } + + public TableCell this[int index] + { + get => new(Range.Cells[index + 1, 1], ParentTable); + } + + public IEnumerator<TableCell> GetEnumerator() + { + return new ColumnEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + + public Column AddLeft() + { + Range.EntireColumn + .Insert(XlInsertShiftDirection.xlShiftToRight, + XlInsertFormatOrigin.xlFormatFromRightOrBelow); + + return ParentTable.Columns[this.Index - 1]; + } +} diff --git a/RhSolutions.ExcelExtensions/ColumnEnumerator.cs b/RhSolutions.ExcelExtensions/ColumnEnumerator.cs new file mode 100644 index 0000000..9880b5d --- /dev/null +++ b/RhSolutions.ExcelExtensions/ColumnEnumerator.cs @@ -0,0 +1,54 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public class ColumnEnumerator : IEnumerator<TableCell> +{ + public Range Range { get; } + public Table ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public TableCell Current + { + get + { + try + { + return new TableCell(Range.Cells[position, 1], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public ColumnEnumerator(Range range, Table 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.ExcelExtensions/Columns.cs b/RhSolutions.ExcelExtensions/Columns.cs new file mode 100644 index 0000000..1fbc0ef --- /dev/null +++ b/RhSolutions.ExcelExtensions/Columns.cs @@ -0,0 +1,39 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public class Columns : IEnumerable<Column> +{ + public Range Range { get; } + public Table ParentTable { get; } + public int Length + { + get => Range.Columns.Count; + } + + public Columns(Range range, Table parentTable) + { + Range = range; + ParentTable = parentTable; + } + + public Column this[int index] + { + get + { + if (index < 0 || index + 1 > Range.Columns.Count) + { + throw new IndexOutOfRangeException(); + } + + return new Column(Range.Columns[index + 1], ParentTable); + } + } + + public IEnumerator<Column> GetEnumerator() + { + return new ColumnsEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +}
\ No newline at end of file diff --git a/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs b/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs new file mode 100644 index 0000000..578e2b0 --- /dev/null +++ b/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs @@ -0,0 +1,54 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public class ColumnsEnumerator: IEnumerator<Column> +{ + public Range Range { get; } + public Table ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public Column Current + { + get + { + try + { + return new Column(Range.Columns[position], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public ColumnsEnumerator(Range range, Table 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.ExcelExtensions/RhSolutions.ExcelExtensions.csproj b/RhSolutions.ExcelExtensions/RhSolutions.ExcelExtensions.csproj new file mode 100644 index 0000000..bf58d4f --- /dev/null +++ b/RhSolutions.ExcelExtensions/RhSolutions.ExcelExtensions.csproj @@ -0,0 +1,15 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>net472;net6.0-windows7.0</TargetFrameworks> + <LangVersion>10</LangVersion> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="ExcelDna.Interop" Version="15.0.1" /> + <PackageReference Include="System.Net.Http" Version="4.3.4" /> + </ItemGroup> + +</Project> diff --git a/RhSolutions.ExcelExtensions/Row.cs b/RhSolutions.ExcelExtensions/Row.cs new file mode 100644 index 0000000..32617b4 --- /dev/null +++ b/RhSolutions.ExcelExtensions/Row.cs @@ -0,0 +1,33 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public sealed class Row : Table, IEnumerable<TableCell> +{ + public int Index + { + get => Range.Row - ParentTable.Range.Row; + } + public int Length + { + get => Range.Columns.Count; + } + + public Row(Range range, Table table) : base(range, table) + { + Range = range; + ParentTable = table; + } + + public TableCell this[int index] + { + get => new(Range.Cells[1, index + 1], ParentTable); + } + + public IEnumerator<TableCell> GetEnumerator() + { + return new RowEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} diff --git a/RhSolutions.ExcelExtensions/RowEnumerator.cs b/RhSolutions.ExcelExtensions/RowEnumerator.cs new file mode 100644 index 0000000..fd56dcd --- /dev/null +++ b/RhSolutions.ExcelExtensions/RowEnumerator.cs @@ -0,0 +1,54 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public class RowEnumerator : IEnumerator<TableCell> +{ + public Range Range { get; } + public Table ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public TableCell Current + { + get + { + try + { + return new TableCell(Range.Cells[1, position], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public RowEnumerator(Range range, Table 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.ExcelExtensions/Rows.cs b/RhSolutions.ExcelExtensions/Rows.cs new file mode 100644 index 0000000..1c0bc0d --- /dev/null +++ b/RhSolutions.ExcelExtensions/Rows.cs @@ -0,0 +1,39 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public class Rows : IEnumerable<Row> +{ + public Range Range { get; } + public Table ParentTable { get; } + public int Length + { + get => Range.Rows.Count; + } + + public Rows(Range range, Table parentTable) + { + Range = range; + ParentTable = parentTable; + } + + public Row this[int index] + { + get + { + if (index < 0 || index + 1 > Range.Rows.Count) + { + throw new IndexOutOfRangeException(); + } + + return new Row(Range.Rows[index + 1], ParentTable); + } + } + + public IEnumerator<Row> GetEnumerator() + { + return new RowsEnumerator(Range, ParentTable); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} diff --git a/RhSolutions.ExcelExtensions/RowsEnumerator.cs b/RhSolutions.ExcelExtensions/RowsEnumerator.cs new file mode 100644 index 0000000..b53db98 --- /dev/null +++ b/RhSolutions.ExcelExtensions/RowsEnumerator.cs @@ -0,0 +1,55 @@ +using System.Collections; + +namespace RhSolutions.ExcelExtensions; + +public class RowsEnumerator : IEnumerator<Row> +{ + public Range Range { get; } + public Table ParentTable { get; } + private int position = 0; + object IEnumerator.Current + { + get + { + return Current; + } + } + + public Row Current + { + get + { + try + { + return new Row(Range.Rows[position], ParentTable); + } + catch (IndexOutOfRangeException) + { + throw new InvalidOperationException(); + } + } + } + + public RowsEnumerator(Range range, Table 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.ExcelExtensions/Table.cs b/RhSolutions.ExcelExtensions/Table.cs new file mode 100644 index 0000000..a19a4b4 --- /dev/null +++ b/RhSolutions.ExcelExtensions/Table.cs @@ -0,0 +1,53 @@ +namespace RhSolutions.ExcelExtensions; + +public class Table +{ + public Range Range { get; protected set; } + public Table ParentTable { get; protected set; } + public Rows Rows { get; } + public Columns Columns { get; } + + public Table(Range range) + { + Range = range; + ParentTable = null; + Rows = new Rows(Range, this); + Columns = new Columns(Range, this); + } + + public Table(Range range, Table table) + { + Range = range; + ParentTable = table; + Rows = new Rows(Range, this); + Columns = new Columns(Range, this); + } + + public TableCell this[int row, int column] + { + get => new(Range.Cells[row + 1, column + 1], this); + } + + public IEnumerable<TableCell> Find(object item) + { + Range firstFound = Range.Find(item); + if (firstFound == null) + { + yield break; + } + + Range nextFound = firstFound; + + while (true) + { + yield return new TableCell(nextFound, ParentTable ?? this); + nextFound = Range.FindNext(nextFound); + + if (nextFound.Row == firstFound.Row + && nextFound.Column == firstFound.Column) + { + yield break; + } + } + } +} diff --git a/RhSolutions.ExcelExtensions/TableCell.cs b/RhSolutions.ExcelExtensions/TableCell.cs new file mode 100644 index 0000000..822673e --- /dev/null +++ b/RhSolutions.ExcelExtensions/TableCell.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.ExcelExtensions; + +public sealed class TableCell : Table +{ + public Row ParentRow + { + get => ParentTable.Rows[ParentTable.Range.Row - Range.Row]; + } + public Column 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 TableCell(Range range, Table table) : base(range, table) + { + Range = range; + ParentTable = table; + } +} diff --git a/RhSolutions.ExcelExtensions/Usings.cs b/RhSolutions.ExcelExtensions/Usings.cs new file mode 100644 index 0000000..94bcc5e --- /dev/null +++ b/RhSolutions.ExcelExtensions/Usings.cs @@ -0,0 +1,3 @@ +global using Microsoft.Office.Interop.Excel; +global using System.Collections.Generic; +global using Range = Microsoft.Office.Interop.Excel.Range;
\ No newline at end of file |