For loop 慢循环数据表收集

For loop 慢循环数据表收集,for-loop,datatable,For Loop,Datatable,我正在使用MySQL数据库中的值更新Excel工作簿中的值。WorkbookMap列表中只有11行,而RptValueSet数据集中只有6个DataTables。我已经证明问题在这个循环中,而不是在与数据库的通信中。获得结果很快,但将结果写入工作簿的速度很慢。当DataSet中的DataTables很小时(例如3列7行结果集),下面的代码可以正常工作,我几乎可以立即收到更新的Excel工作簿。然而,当结果集增加时,循环速度明显减慢;一个3列50行的DataTable会导致返回更新后的Excel工

我正在使用MySQL数据库中的值更新Excel工作簿中的值。
WorkbookMap
列表中只有11行,而
RptValueSet
数据集中只有6个
DataTables
。我已经证明问题在这个循环中,而不是在与数据库的通信中。获得结果很快,但将结果写入工作簿的速度很慢。当
DataSet
中的
DataTables
很小时(例如3列7行结果集),下面的代码可以正常工作,我几乎可以立即收到更新的Excel工作簿。然而,当结果集增加时,循环速度明显减慢;一个3列50行的
DataTable
会导致返回更新后的Excel工作簿延迟7-10秒。我不确定我是否真的需要将
DataTables
放入一个集合中,但这是我找到如何迭代它们的唯一方法。任何关于优化此循环的提示都将不胜感激

// Create a list to contain the destination for the data in the workbook
List<WorkbookMap> wbMap = new List<WorkbookMap>();

// Create a new data set to contain results from database
DataSet RptValuesSet = new DataSet(); 

   // RptValuesSet populated from database here....

// Create a collection so we can loop thru the dataset
DataTableCollection RptValuesColl = RptValuesSet.Tables;

for (int i = 0; i < RptValuesColl.Count; i++)
{
    DataTable tbl = RptValuesColl[i];

    // Find the correct entry in the workbook map
    for (int j = 0; j < wbMap.Count; j++)
    {
        if (wbMap[j].SPCall == tbl.TableName) 
        {
            // Write the results to the correct location in the workbook
            MovingColumnRef = wbMap[j].StartColumn;
            for (int c = 1; c < tbl.Columns.Count; c++)
            {
                row = wbMap[j].StartRow; // start at the top row for each new column
                for (int r = 0; r < tbl.Rows.Count; r++)
                {
                    // Write the database value to the workbook given the sheetName and cell address
                    UpdateValue(wbMap[j].SheetName, MovingColumnRef + row, tbl.Rows[r][c].ToString(), 0, wbMap[j].String);
                    row++;
                }
                MovingColumnRef = IncrementColRef(MovingColumnRef);
            }
        }
    }
}
//创建一个列表以包含工作簿中数据的目标
List wbMap=新列表();
//创建新数据集以包含来自数据库的结果
数据集RptValuesSet=新数据集();
//RPTPaluesset从此处的数据库填充。。。。
//创建一个集合,以便我们可以循环遍历数据集
DataTableCollection RptValuesColl=RptValuesSet.Tables;
对于(int i=0;i
无需深入研究您的代码。我注意到你说你相信写在纸上会变慢。在更新工作簿之前,请先尝试将数据放入数组。你会这样写在纸上。anchorRangeName是工作簿中只有一个单元格的区域的名称

  private void WriteResultToRange(Excel.Workbook wb, string anchorRangeName, object[,] resultArray)
    {
        Excel.Range resultRange = GetRange(anchorRangeName, wb).get_Resize(resultArray.GetLength(0), resultArray.GetLength(1));
        resultRange.Value2 = resultArray;


    }

您仍然需要将数据从数据库中获取到数组中。

我没有使用使用参考库Microsoft.Office.Interop.Excel-我正在使用OpenXML SDK直接操作工作簿xml。因此,我必须一次编写一个单元格引用。不过,谢谢你的意见。你的建议为我指明了正确的方向。在“UpdateValue”函数中,我在工作表上调用了一个.Save()。一旦我注释掉保存,性能又好了。谢谢