2016-07-20 17 views
2

Ich verwende derzeit Interop-Objekte, um in eine Excel-Tabelle zu schreiben. Mit Stoppuhren habe ich festgestellt, dass die folgende Implementierung ziemlich aktuell ist. Die Prozesse in der foreach-Schleife benötigen normalerweise ungefähr 50 Sekunden, um ungefähr 2000 Zeilen mit jeweils 9 Spalten zu schreiben.So beschleunigen Sie das Schreiben in eine Excel-Tabelle

Gibt es eine Möglichkeit, dies zu beschleunigen?

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

Überprüfen Sie CopyFromRecordset. Hinweise https://support.microsoft.com/en-us/kb/246335 – Fionnuala

+0

'Stoppuhren verwenden = = und Freigabe-Modus mit Optimierung aktiviert? –

+0

@ThomasAyoub Ja und ja. – Queue

Antwort

3

Versuchen Sie das Array auf einen Bereich, anstatt zu brechen zuweisen und Zelle für Zelle zuweisen:

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; 

Edit: Wenn Sie die Dinge noch mehr beschleunigen möchten, können Sie einen bidimensional zuweisen könnte Array (string [,], wobei die erste Dimension die Zeilen und die zweite die Spalten sind) zu einem Bereich derselben Größe.

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

Danke. Das ist 50% schneller. – Queue

+1

@Queue Sie könnten die Dinge sogar noch beschleunigen, wenn Sie fillStringArrayList() ändern können, um eine Zeichenkette [,] anstelle der Liste zurückzugeben. Dann könnten Sie die gesamten allEntries einem einzelnen Bereich der gleichen Größe zuweisen. – Magnetron

+0

Großartig! Ich werde es versuchen. – Queue