aboutsummaryrefslogtreecommitdiff
path: root/RhSolutions.ExcelExtensions/Table.cs
blob: aad21517a75d7d9a14672e9af28d421b922e3b24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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; }
    private Dictionary<string, Column> _columnsByHeader;

    public Table(Range range)
    {
        Range = range;
        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 Column ColumnByHeader(string header)
    {
        return _columnsByHeader[header];
    }

    public Cell this[int row, int column]
    {
        get => this.Rows[row][column];
    }

    public IEnumerable<Cell> Search(object item)
    {
        Range firstFound = Range.Find(item);
        if (firstFound == null)
        {
            yield break;
        }

        Range nextFound = firstFound;

        while (true)
        {
            yield return this[nextFound.Row - ParentTable.Range.Row, nextFound.Column - ParentTable.Range.Column];
            nextFound = Range.FindNext(nextFound);

            if (nextFound.Row == firstFound.Row
                && nextFound.Column == firstFound.Column)
            {
                yield break;
            }
        }
    }
}