Умная таблица Excel с использованием C# Interop.Excel

На двух листах Excel (первый лист вводимые данные, второй своего рода база данных) есть таблицы с заголовком, подзаголовком и подподзаголовком и ячейками (сверху вниз для данных) введите сюда описание изображения

На первом листе могут быть не все подзаголовки (только те которые будут отображены пользователем), а на втором (база данных) будет вся таблица целиком. Также в любой момент в таблицу из базы данных могут добавляться новые подзаголовки и/или подподзаголовки. Задача состоит в том, чтобы соединить две таблицы. Чтобы при вводе данных в таблицу на листе1 данные автоматически записывались в нужную ячейку таблицы базы данных. Пробовал сделать следующим образом:

  1. Создал класс для хранения таблиц:

    namespace SpecialTable
    {
        public class Base
        {
            public string _name;
            public Excel.Worksheet _worksheet;
            public Excel.Range _range, _head, _body;
    
            public Base _parent;
            public Dictionary<string, Base> childs;
    
            public Base()
            {
                childs = new Dictionary<string, Base>();
            }
    
            public virtual void Generate()
            {
                _head = (Excel.Range)_range.Rows[1];
                _body = _range.Resize[_range.Rows.Count - 1].Offset[1];
                SplitChilds<Level>();
            }
    
            protected void SplitChilds<T>() where T : Base, new()
            {
                childs.Clear();
                int maxColumn = ((Excel.Range)_body.Columns[_body.Columns.Count]).Column;
                int resizeColumns;
                int bodyColumnsCount = _body.Columns.Count;
                int bodyRowsCount = _body.Rows.Count;
    
                Excel.Range rng1 = ((Excel.Range)_body.Cells[1, 1]);
                Excel.Range rng2;
    
                while (rng1.Column <= maxColumn)
                {
                    resizeColumns = rng1.MergeArea.Columns.Count;
                    rng2 = rng1.Resize[bodyRowsCount, resizeColumns];
                    string name = (string)((Excel.Range)rng2.Cells[1, 1]).Value;
                    string address = rng2.Address;
                    childs.Add(name, new T(){_name = name ,_worksheet = this._worksheet, _range = rng2});
                    childs[name].Generate();
                    rng1 = rng1.Offset[0, 1];
                }
            }
        }
    }
    

2.Создал классы для разных уровней заголовков (в предыдущем коде тип Level). На последнем уровне есть два словаря

    protected Dictionary<int, string> cellByDay;
    protected Dictionary<string, int> dayByCell;

и код для Generate следующий

    public override void Generate()
    {
        base.Generate();
        if (_range.ContainsRange(MenuBase._activeRange))
        {
            Main.instance.connector._activeDTL = _name;
        }
        int day = 1;
        int i = 1;
        while (day <= 31)
        {
            if (i != 11 && i != 22 & i != 23)
            {
                cellByDay.Add(day, ((Excel.Range)_body.Cells[i, 1]).Address);
                dayByCell.Add(((Excel.Range)_body.Cells[i, 1]).Address, day);
                if (((Excel.Range)_body.Cells[i, 1]).ContainsRange(MenuBase._activeRange))
                    Main.instance.connector._activeDay = day;
                day++;
            }
            i++;
        }
    }

Таких таблиц много. Соединение таблиц выполняется при смене активной ячейки. Проблема состоит в том что этот код выполняется долго и подвисает. Подскажите как можно улучшить код, либо можно использовать какой-нибудь другой подход для выполнения этой задачи?


Ответы (0 шт):