2016-07-20 16 views
2

現在、Excelスプレッドシートに書き込むためにInteropオブジェクトを使用しています。ストップウォッチを使用して、私は次の実装が非常にタイムリーであることを発見しました。 foreachループ内のプロセスは、通常、それぞれ約9行の2000行を書き込むのに約50秒かかります。Excelシートへの書き込みを高速化する方法

これをスピードアップする方法はありますか?

List<string[]> allEntries = fillStringArrayList(); 

// Set-up for running Excel 
xls = new Excel.Application(); 
workBooks = xls.Workbooks; 
workBook = workBooks.Open(workbookPath); 
var workSheet = workBook.Sheets["Sheet1"]; 

// Insert new entries 
foreach (string[] entry in allEntries) 
{ 
    // Get the final row in the sheet that is being used 
    Excel.Range usedRange = workSheet.UsedRange; 
    int rowCount = usedRange.Rows.Count; 

    // Format Column A to be type "text" 
    workSheet.Cells[rowCount + 1, 1].NumberFormat = "@"; 

    workSheet.Cells[rowCount + 1, 1] = entry[0]; 
    workSheet.Cells[rowCount + 1, 2] = entry[1]; 
    workSheet.Cells[rowCount + 1, 3] = entry[2]; 
    workSheet.Cells[rowCount + 1, 4] = entry[3]; 
    workSheet.Cells[rowCount + 1, 5] = entry[4]; 
    workSheet.Cells[rowCount + 1, 6] = entry[5]; 
    workSheet.Cells[rowCount + 1, 7] = entry[6]; 
    workSheet.Cells[rowCount + 1, 8] = entry[7]; 
    workSheet.Cells[rowCount + 1, 9] = entry[8]; 
} 
+0

「CopyFromRecordset」を確認します。注意https://support.microsoft.com/en-us/kb/246335 – Fionnuala

+0

'stopwatches'を使う=>最適化を有効にしたモードを解除しますか? –

+0

@ThomasAyoubはい&はい。 – Queue

答えて

3

代わりにブレークの範囲に配列を割り当て、セルによってセルを割り当てるようにしてください:

Excel.Range c1 = (Excel.Range)workSheet.Cells[rowCount + 1, 1]; 
Excel.Range c2 = (Excel.Range)workSheet.Cells[rowCount + 1, 9]; 
Excel.Range range = workSheet.get_Range(c1, c2); 
range.Value = entry; 

編集: あなたも、より多くの物事をスピードアップしたい場合は、二次元を割り当てることができます配列(string [、]、最初の次元は行、2番目は列)は同じサイズの範囲になります。

int firstLine = rowCount + 1; 
Excel.Range c1 = (Excel.Range)workSheet.Cells[firstLine, 1]; 

//Gets the size of the first dimension of the array 
int arrayXSize = allEntries.GetLength(0); 

Excel.Range c2 = (Excel.Range)workSheet.Cells[firstLine + arrayXSize -1, 9]; 
Excel.Range range = workSheet.get_Range(c1, c2); 

//allEntries is a string[,] 
range.Value = allEntries; 
+0

ありがとうございます。これは50%高速です。 – Queue

+1

@Queueリストの代わりに文字列[、]を返すようにfillStringArrayList()を変更できると、さらに高速化できます。次に、allEntries全体を同じサイズの単一の範囲に割り当てることができます。 – Magnetron

+0

壮大!私はそれを行ってあげるよ。 – Queue

関連する問題