我已经使用随机值和公式填充我的数据表,如 =SUM(A1:A2) ,当数据表中有150列和4000行时,ReoGrid需要大约20分钟才能填充 .

当我在没有公式的情况下填充ReoGrid时,它需要几秒钟来填充ReoGrid,但是当动态分配给单元格的许多SUM公式时,ReoGrid需要很长时间才能填充 .

我在这里分享我的代码 . 所以我的请求请大家看看我的代码逻辑并告诉我在为ReoGrid的许多单元格分配公式时有任何缺陷 .

请告诉我如何简化用公式填充网格的逻辑 . 有没有办法通过公式提高我的代码的性能,因此ReoGrid可以在几秒或几分钟内填充 .

寻找建议和指导方针 . ReoGrid是winform应用程序https://reogrid.net/的免费组件 .

这是我的代码

private void btnBindTable_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    string strSum = "", strColName, strImmediateOneUp = "", strImmediateTwoUp = "";

    int startsum = 0;
    int currow = 0;
    bool firstTimeSum = true;

    int NumRows = 4000;
    int NumColumns = 150;

    var sheet = reoGrd.CurrentWorksheet;
    sheet.Resize(NumRows, NumColumns);  // resize 

    DataTable dt = new DataTable();

    for (int col = 0; col < NumColumns; col++)
    {
        strColName = GenerateColumnText(col);
        DataColumn datacol = new DataColumn(strColName, typeof(string));
        dt.Columns.Add(datacol);
    }


    for (int row = 0; row < NumRows; row++)
    {
        dt.Rows.Add();

        for (int col = 0; col < NumColumns; col++)
        {
            if (row < 2)
            {
                dt.Rows[row][col] = new Random().Next(1, NumRows).ToString("D2"); 
            }
            else
            {
                if (firstTimeSum)
                {
                    if (row - currow == 2)
                    {
                        currow = row;
                        startsum = 0;
                        firstTimeSum = false;
                    }
                    else
                    {
                        startsum = 1;
                    }
                }
                else
                {
                    if (row - currow == 3)
                    {
                        currow = row;
                        startsum = 0;
                    }
                }


                if (startsum == 0)
                {
                    strColName = GenerateColumnText(col);
                    strImmediateOneUp = strColName + ((row + 1) - 1).ToString();
                    strImmediateTwoUp = strColName + ((row + 1) - 2).ToString();
                    dt.Rows[row][col] = strSum; 

                    string cellname = GenerateColumnText(col) + (row + 1).ToString();
                    var cell = sheet.Cells[cellname];
                    cell.Style.BackColor = Color.LightGoldenrodYellow;
                }
                else
                {
                    dt.Rows[row][col] = new Random().Next(1, NumRows).ToString("D2"); 
                }
            }

        }

        startsum = 1;
    }

    sheet["A1"] = dt;

    stopwatch.Stop();
    TimeSpan timeSpan = stopwatch.Elapsed;

    MessageBox.Show(string.Format("Time elapsed: {0}h {1}m {2}s {3}ms", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds));

}