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

На первом листе могут быть не все подзаголовки (только те которые будут отображены пользователем), а на втором (база данных) будет вся таблица целиком. Также в любой момент в таблицу из базы данных могут добавляться новые подзаголовки и/или подподзаголовки. Задача состоит в том, чтобы соединить две таблицы. Чтобы при вводе данных в таблицу на листе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++;
}
}
Таких таблиц много. Соединение таблиц выполняется при смене активной ячейки. Проблема состоит в том что этот код выполняется долго и подвисает. Подскажите как можно улучшить код, либо можно использовать какой-нибудь другой подход для выполнения этой задачи?