Самый быстрый способ извлечь данные из SQL Server и заполнить диапазон Excel - PullRequest
0 голосов
/ 13 января 2011

Мне пришлось заполнить диапазон Excel из SQL Server по следующей схеме

    C1 C2 C3....C29
L1 
L2 
L3 
L4
L5
.....
L120

Мне было интересно, что может быть самым быстрым способом получения каждого значения, соответствующего каждой паре (Li,Cj), значение которого хранится в SqlServer?

Я не мог перебрать каждую ячейку.

Каким могло быть ваше решение?

Я должен сказать, что мне удалось получить эти данные менее чем за 3 секунды

Ответы [ 2 ]

0 голосов
/ 28 января 2011

Вместо того чтобы делать отдельный вызов хранимой процедуры для каждой пары (L, C), сделайте один вызов, который выбирает все пары в таблице. Надеемся, что нет никаких предварительных условий, которые бы препятствовали этому. В противном случае из-за одних только вызовов SQL вы не сможете получить данные обратно менее чем за 3 секунды. Потяните данные в SqlDataReader, если можете.

Затем заполните переменную 2D-массива в соответствии с соотношением (L, C) в полученных данных. В Excel используется массив на основе 1, который можно эмулировать (но не обязательно), как показано ниже:

// this creates a 1-based 2D array with 5 rows, 2 columns (5,2)
var my2DArray = Array.CreateInstance(
    typeof(object), new int[] { 5, 2 }, new int[] { 1, 1 });

После заполнения 2D-массива установите массив на лист Excel. Код будет выглядеть примерно так:

// not sure what your cell refs are, so I'll be arbitrary...
var rng = myWorksheet.get_Range("A1", "B1");
rng = rng.get_Resize(my2DArray.GetUpperBound(0), my2DArrary.GetUpperBound(1));
rng.Value2 = my2DArray;

Это должен быть самый быстрый способ по сравнению с настройкой значений ячейки по одному.

0 голосов
/ 13 января 2011

Самый быстрый способ, который обеспечивает VSTO, - это вспомогательная функция, описанная в этой статье: http://social.msdn.microsoft.com/Forums/en/vsto/thread/5cfc24cd-cbeb-4583-b6c8-ad1521e31267

Если все, что у вас есть, это массив, то вы можете присвоить массив непосредственно значению 2 диапазона, и он будет заполнен достаточнобыстро.

Вы можете установить Application.EnableEvents = False и Application.ScreenUpdating = False, чтобы значительно ускорить процесс.Не забудьте сбросить их после процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...