2016-07-20 5 views
2

현재 Interop 개체를 사용하여 Excel 스프레드 시트에 쓰고 있습니다. 스톱워치를 사용하여, 나는 다음과 같은 이행이시기 적절하다는 것을 발견했다. 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

Check CopyFromRecordset. 참고 https://support.microsoft.com/en-us/kb/246335 – Fionnuala

+0

'스톱워치 사용 => 및 최적화 모드가 해제 된 모드? –

+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; 

편집

: 당신은 더 많은 일을 빠르게하려면 , 당신은 bidimensional를 할당 할 수 array (string [,], 첫 번째 차원은 행이고 두 번째 차원은 같은 크기의 범위).

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 List 대신 string [,]을 반환하도록 fillStringArrayList()를 수정할 수 있다면 더 빨리 작업을 수행 할 수 있습니다. 그런 다음 전체 allEntries를 동일한 크기의 단일 범위에 할당 할 수 있습니다. – Magnetron

+0

장엄한! 나는 그것을 줄 것이다. – Queue