diff options
Diffstat (limited to 'RhSolutions.ExcelExtensions')
-rw-r--r-- | RhSolutions.ExcelExtensions/Cell.cs | 26 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Column.cs | 60 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/ColumnEnumerator.cs | 54 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Columns.cs | 24 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/ColumnsEnumerator.cs | 16 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Row.cs | 51 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/RowEnumerator.cs | 54 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Rows.cs | 23 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/RowsEnumerator.cs | 17 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/Table.cs | 35 | ||||
-rw-r--r-- | RhSolutions.ExcelExtensions/TableCell.cs | 24 |
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; - } -} |