MySQL データベースの値を使用して Excel ワークブックの値を更新しています。WorkbookMap
リストには 11 行しかなくDataTables
、RptValueSet
DataSet
. データベースとの通信ではなく、このループに問題があることを証明しました。結果の取得は高速ですが、ワークブックへの書き込みは低速です。以下のコードは、3 列、7 行の結果セットなど、サイズが小さい場合に正常に機能し、更新された Excel ワークブックをほぼ瞬時に受け取りますDataTables
。DataSet
ただし、結果セットが増加すると、ループの速度が著しく低下します。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);
}
}
}
}