我正在使用MySQL数据库中的值更新Excel工作簿中的值。 WorkbookMap
列表中只有11行,DataTables
RptValueSet
中有6 DataSet
行。我已经证明问题出在这个循环中,而不是与数据库的通信。获得结果很快,但将它们写入工作簿很慢。当DataTables
中的DataSet
很小时,下面的代码工作正常 - 例如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);
}
}
}
}
答案 0 :(得分:0)
无需深入研究您的代码。我注意到你说你相信慢慢来自于写到表格。在更新工作簿之前,请先尝试将数据放入Array中。例如。你会写这样的表格。 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;
}
您仍然需要将数据库中的数据转换为数组。