2016-07-20 2 views
2

В настоящее время я использую объекты Interop для записи в электронную таблицу Excel. Используя секундомеры, я обнаружил, что следующая реализация довольно своевременна. Процессы цикла foreach, как правило, занимают около 50 секунд, чтобы записать около 2000 строк, каждый из которых содержит 9 столбцов.Как ускорить запись в лист 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; 

Edit: Если вы хотите ускорить процесс, даже больше, вы можете назначить двумерном 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 Вы можете ускорить работу еще больше, если вы можете изменить fillStringArrayList(), чтобы вернуть строку [,] вместо списка . Затем вы можете назначить все allEntries одному диапазону того же размера. – Magnetron

+0

Великолепный! Я отдам его. – Queue

Смежные вопросы