1

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

1 に答える 1

0

コードを深く掘り下げることなく。遅さはシートに書くことから来ているとあなたが信じているとあなたが言ったことに気づきました。ブックを更新する前に、まずデータを配列に入れてみてください。たとえば、このようにシートに書き込みます。branchRangeNameは、ブック内の1つのセルのみとなる範囲の名前です。

  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;


    }

それでも、データベースから配列にデータを取得する必要があります。

于 2012-11-06T20:26:18.593 に答える