aboutsummaryrefslogtreecommitdiff
path: root/RhSolutions.ExcelExtensions
diff options
context:
space:
mode:
Diffstat (limited to 'RhSolutions.ExcelExtensions')
-rw-r--r--RhSolutions.ExcelExtensions/Cell.cs26
-rw-r--r--RhSolutions.ExcelExtensions/Column.cs60
-rw-r--r--RhSolutions.ExcelExtensions/ColumnEnumerator.cs54
-rw-r--r--RhSolutions.ExcelExtensions/Columns.cs24
-rw-r--r--RhSolutions.ExcelExtensions/ColumnsEnumerator.cs16
-rw-r--r--RhSolutions.ExcelExtensions/Row.cs51
-rw-r--r--RhSolutions.ExcelExtensions/RowEnumerator.cs54
-rw-r--r--RhSolutions.ExcelExtensions/Rows.cs23
-rw-r--r--RhSolutions.ExcelExtensions/RowsEnumerator.cs17
-rw-r--r--RhSolutions.ExcelExtensions/Table.cs35
-rw-r--r--RhSolutions.ExcelExtensions/TableCell.cs24
11 files changed, 169 insertions, 215 deletions
diff --git a/RhSolutions.ExcelExtensions/Cell.cs b/RhSolutions.ExcelExtensions/Cell.cs
new file mode 100644
index 0000000..19a2017
--- /dev/null
+++ b/RhSolutions.ExcelExtensions/Cell.cs
@@ -0,0 +1,26 @@
+namespace RhSolutions.ExcelExtensions;
+
+public sealed class Cell
+{
+ public Table ParentTable { get; }
+ 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;
+ }
+ private Range _range;
+
+ public Cell(Range range, Table table)
+ {
+ _range = range;
+ ParentTable = table;
+ }
+}
diff --git a/RhSolutions.ExcelExtensions/Column.cs b/RhSolutions.ExcelExtensions/Column.cs
index 53a1f3d..341897c 100644
--- a/RhSolutions.ExcelExtensions/Column.cs
+++ b/RhSolutions.ExcelExtensions/Column.cs
@@ -1,44 +1,62 @@
-using System.Collections;
+namespace RhSolutions.ExcelExtensions;
-namespace RhSolutions.ExcelExtensions;
-
-public sealed class Column : Table, IEnumerable<TableCell>
+public sealed class Column
{
+ public Table ParentTable { get; }
public string Header
{
- get => Range.Cells[1, 1].Value.ToString();
+ get => _range.Cells[1, 1].Value2.ToString() ?? String.Empty;
}
public int Index
{
- get => Range.Column - ParentTable.Range.Column;
+ 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;
+ get => _range.Rows.Count;
}
+ private Cell[] _cells;
+ private readonly Range _range;
- public TableCell this[int index]
+ public Column(Range range, Table table)
{
- get => new(Range.Cells[index + 1, 1], ParentTable);
+ _cells = new Cell[range.Rows.Count];
+ _range = range;
+ ParentTable = table ??
+ throw new ArgumentNullException("table");
}
- public IEnumerator<TableCell> GetEnumerator()
+ public Cell this[int index]
{
- return new ColumnEnumerator(Range, ParentTable);
+ get
+ {
+ if (_cells[index] == null)
+ {
+ _cells[index] = new Cell(_range.Cells[index + 1, 1], ParentTable);
+ return _cells[index];
+ }
+ else
+ {
+ return _cells[index];
+ }
+ }
+ set
+ {
+ if (_cells[index] == null)
+ {
+ _cells[index] = new Cell(_range.Cells[index + 1, 1], ParentTable);
+ _cells[index].Value = value;
+ }
+ else
+ {
+ _cells[index].Value = value;
+ }
+ }
}
- IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
-
-
public Column AddLeft()
{
- Range.EntireColumn
+ _range.EntireColumn
.Insert(XlInsertShiftDirection.xlShiftToRight,
XlInsertFormatOrigin.xlFormatFromRightOrBelow);
diff --git a/RhSolutions.ExcelExtensions/ColumnEnumerator.cs b/RhSolutions.ExcelExtensions/ColumnEnumerator.cs
deleted file mode 100644
index 9880b5d..0000000
--- a/RhSolutions.ExcelExtensions/ColumnEnumerator.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-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
index 1fbc0ef..014b755 100644
--- a/RhSolutions.ExcelExtensions/Columns.cs
+++ b/RhSolutions.ExcelExtensions/Columns.cs
@@ -4,35 +4,45 @@ namespace RhSolutions.ExcelExtensions;
public class Columns : IEnumerable<Column>
{
- public Range Range { get; }
public Table ParentTable { get; }
public int Length
{
- get => Range.Columns.Count;
+ get => _range.Columns.Count;
}
+ private Column[] _columns;
+ private Range _range;
- public Columns(Range range, Table parentTable)
+ public Columns(Table parentTable)
{
- Range = range;
ParentTable = parentTable;
+ _range = parentTable.Range;
+ _columns = new Column[Length];
}
public Column this[int index]
{
get
{
- if (index < 0 || index + 1 > Range.Columns.Count)
+ if (index < 0 || index >= Length)
{
throw new IndexOutOfRangeException();
}
- return new Column(Range.Columns[index + 1], ParentTable);
+ if (_columns[index] == null)
+ {
+ _columns[index] = new Column(_range.Columns[index + 1], ParentTable);
+ return _columns[index];
+ }
+ else
+ {
+ return _columns[index];
+ }
}
}
public IEnumerator<Column> GetEnumerator()
{
- return new ColumnsEnumerator(Range, ParentTable);
+ return new ColumnsEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
diff --git a/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs b/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs
index 578e2b0..40ad4d6 100644
--- a/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs
+++ b/RhSolutions.ExcelExtensions/ColumnsEnumerator.cs
@@ -4,9 +4,8 @@ namespace RhSolutions.ExcelExtensions;
public class ColumnsEnumerator: IEnumerator<Column>
{
- public Range Range { get; }
- public Table ParentTable { get; }
- private int position = 0;
+ private Columns _columns;
+ private int position = -1;
object IEnumerator.Current
{
get
@@ -21,7 +20,7 @@ public class ColumnsEnumerator: IEnumerator<Column>
{
try
{
- return new Column(Range.Columns[position], ParentTable);
+ return _columns[position];
}
catch (IndexOutOfRangeException)
{
@@ -30,21 +29,20 @@ public class ColumnsEnumerator: IEnumerator<Column>
}
}
- public ColumnsEnumerator(Range range, Table table)
+ public ColumnsEnumerator(Columns columns)
{
- Range = range;
- ParentTable = table;
+ _columns = columns;
}
public bool MoveNext()
{
position++;
- return (position <= Range.Columns.Count);
+ return (position < _columns.Length);
}
public void Reset()
{
- position = 0;
+ position = -1;
}
public void Dispose()
diff --git a/RhSolutions.ExcelExtensions/Row.cs b/RhSolutions.ExcelExtensions/Row.cs
index 32617b4..01df2e4 100644
--- a/RhSolutions.ExcelExtensions/Row.cs
+++ b/RhSolutions.ExcelExtensions/Row.cs
@@ -1,33 +1,54 @@
-using System.Collections;
+namespace RhSolutions.ExcelExtensions;
-namespace RhSolutions.ExcelExtensions;
-
-public sealed class Row : Table, IEnumerable<TableCell>
+public sealed class Row
{
+ public Table ParentTable { get; }
public int Index
{
- get => Range.Row - ParentTable.Range.Row;
+ get => _range.Row - ParentTable.Range.Row;
}
public int Length
{
- get => Range.Columns.Count;
+ get => _range.Columns.Count;
}
+ private readonly Cell[] _cells;
+ private readonly Range _range;
- public Row(Range range, Table table) : base(range, table)
+ public Row(Range range, Table table)
{
- Range = range;
- ParentTable = table;
+ _cells = new Cell[range.Columns.Count];
+ _range = range;
+ ParentTable = table ??
+ throw new ArgumentNullException("table");
}
- public TableCell this[int index]
+ public Cell this[int index]
{
- get => new(Range.Cells[1, index + 1], ParentTable);
+ get
+ {
+ if (index < 0 || index >= Length)
+ {
+ throw new IndexOutOfRangeException();
+ }
+
+ if (_cells[index] == null)
+ {
+ _cells[index] = new Cell(_range.Cells[1, index + 1], ParentTable);
+ return _cells[index];
+ }
+ else
+ {
+ return _cells[index];
+ }
+ }
}
- public IEnumerator<TableCell> GetEnumerator()
+ public Cell this[string header]
{
- return new RowEnumerator(Range, ParentTable);
+ get
+ {
+ int columnIndex = ParentTable.ColumnByHeader(header).Index;
+ return this[columnIndex];
+ }
}
-
- IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
diff --git a/RhSolutions.ExcelExtensions/RowEnumerator.cs b/RhSolutions.ExcelExtensions/RowEnumerator.cs
deleted file mode 100644
index fd56dcd..0000000
--- a/RhSolutions.ExcelExtensions/RowEnumerator.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-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
index 1c0bc0d..c6d4c01 100644
--- a/RhSolutions.ExcelExtensions/Rows.cs
+++ b/RhSolutions.ExcelExtensions/Rows.cs
@@ -4,35 +4,40 @@ namespace RhSolutions.ExcelExtensions;
public class Rows : IEnumerable<Row>
{
- public Range Range { get; }
public Table ParentTable { get; }
public int Length
{
- get => Range.Rows.Count;
+ get => _range.Rows.Count;
}
+ private Row[] _rows;
+ private Range _range;
- public Rows(Range range, Table parentTable)
+ public Rows(Table parentTable)
{
- Range = range;
ParentTable = parentTable;
+ _range = parentTable.Range;
+ _rows = new Row[Length];
}
public Row this[int index]
{
get
{
- if (index < 0 || index + 1 > Range.Rows.Count)
+ if (_rows[index] == null)
{
- throw new IndexOutOfRangeException();
+ _rows[index] = new Row(_range.Rows[index + 1], ParentTable);
+ return _rows[index];
+ }
+ else
+ {
+ return _rows[index];
}
-
- return new Row(Range.Rows[index + 1], ParentTable);
}
}
public IEnumerator<Row> GetEnumerator()
{
- return new RowsEnumerator(Range, ParentTable);
+ return new RowsEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
diff --git a/RhSolutions.ExcelExtensions/RowsEnumerator.cs b/RhSolutions.ExcelExtensions/RowsEnumerator.cs
index b53db98..4d68a9c 100644
--- a/RhSolutions.ExcelExtensions/RowsEnumerator.cs
+++ b/RhSolutions.ExcelExtensions/RowsEnumerator.cs
@@ -4,9 +4,8 @@ namespace RhSolutions.ExcelExtensions;
public class RowsEnumerator : IEnumerator<Row>
{
- public Range Range { get; }
- public Table ParentTable { get; }
- private int position = 0;
+ private Rows _rows;
+ private int position = -1;
object IEnumerator.Current
{
get
@@ -21,7 +20,7 @@ public class RowsEnumerator : IEnumerator<Row>
{
try
{
- return new Row(Range.Rows[position], ParentTable);
+ return _rows[position];
}
catch (IndexOutOfRangeException)
{
@@ -30,26 +29,24 @@ public class RowsEnumerator : IEnumerator<Row>
}
}
- public RowsEnumerator(Range range, Table table)
+ public RowsEnumerator(Rows rows)
{
- Range = range;
- ParentTable = table;
+ _rows = rows;
}
public bool MoveNext()
{
position++;
- return (position <= Range.Rows.Count);
+ return (position < _rows.Length);
}
public void Reset()
{
- position = 0;
+ position = -1;
}
public void Dispose()
{
}
-
} \ No newline at end of file
diff --git a/RhSolutions.ExcelExtensions/Table.cs b/RhSolutions.ExcelExtensions/Table.cs
index a19a4b4..aad2151 100644
--- a/RhSolutions.ExcelExtensions/Table.cs
+++ b/RhSolutions.ExcelExtensions/Table.cs
@@ -6,29 +6,40 @@ public class Table
public Table ParentTable { get; protected set; }
public Rows Rows { get; }
public Columns Columns { get; }
+ private Dictionary<string, Column> _columnsByHeader;
public Table(Range range)
{
Range = range;
- ParentTable = null;
- Rows = new Rows(Range, this);
- Columns = new Columns(Range, this);
+ ParentTable = this;
+ Rows = new Rows(this);
+ Columns = new Columns(this);
+ _columnsByHeader = new();
+
+ foreach(var column in Columns)
+ {
+ if (_columnsByHeader.ContainsKey(column.Header))
+ {
+ throw new ArgumentException($"Заголовок столбца {column.Header} не уникален");
+ }
+ else
+ {
+ _columnsByHeader.Add(column.Header, column);
+ }
+ }
}
- public Table(Range range, Table table)
+ public Column ColumnByHeader(string header)
{
- Range = range;
- ParentTable = table;
- Rows = new Rows(Range, this);
- Columns = new Columns(Range, this);
+ return _columnsByHeader[header];
}
- public TableCell this[int row, int column]
+ public Cell this[int row, int column]
{
- get => new(Range.Cells[row + 1, column + 1], this);
+ get => this.Rows[row][column];
}
- public IEnumerable<TableCell> Find(object item)
+ public IEnumerable<Cell> Search(object item)
{
Range firstFound = Range.Find(item);
if (firstFound == null)
@@ -40,7 +51,7 @@ public class Table
while (true)
{
- yield return new TableCell(nextFound, ParentTable ?? this);
+ yield return this[nextFound.Row - ParentTable.Range.Row, nextFound.Column - ParentTable.Range.Column];
nextFound = Range.FindNext(nextFound);
if (nextFound.Row == firstFound.Row
diff --git a/RhSolutions.ExcelExtensions/TableCell.cs b/RhSolutions.ExcelExtensions/TableCell.cs
deleted file mode 100644
index 822673e..0000000
--- a/RhSolutions.ExcelExtensions/TableCell.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-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;
- }
-}