aboutsummaryrefslogtreecommitdiff
path: root/RhSolutions.ExcelExtensions
diff options
context:
space:
mode:
Diffstat (limited to 'RhSolutions.ExcelExtensions')
-rw-r--r--RhSolutions.ExcelExtensions/Column.cs47
-rw-r--r--RhSolutions.ExcelExtensions/ColumnEnumerator.cs54
-rw-r--r--RhSolutions.ExcelExtensions/Columns.cs39
-rw-r--r--RhSolutions.ExcelExtensions/ColumnsEnumerator.cs54
-rw-r--r--RhSolutions.ExcelExtensions/RhSolutions.ExcelExtensions.csproj15
-rw-r--r--RhSolutions.ExcelExtensions/Row.cs33
-rw-r--r--RhSolutions.ExcelExtensions/RowEnumerator.cs54
-rw-r--r--RhSolutions.ExcelExtensions/Rows.cs39
-rw-r--r--RhSolutions.ExcelExtensions/RowsEnumerator.cs55
-rw-r--r--RhSolutions.ExcelExtensions/Table.cs53
-rw-r--r--RhSolutions.ExcelExtensions/TableCell.cs24
-rw-r--r--RhSolutions.ExcelExtensions/Usings.cs3
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