从SQL Server获取数据并填充Excel范围的最快方法

时间:2011-01-13 15:23:48

标签: excel sql-server-2008 vsto

我必须根据以下方案从SQL Server填写Excel范围

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

我想知道什么是获取每对(Li,Cj)对应的每个值的最快方法,这个值存储在SqlServer中?

我无法遍历每个单元格。

你的解决方案可能是什么?

我必须说我设法在不到3秒的时间内检索这些数据

2 个答案:

答案 0 :(得分:0)

VSTO提供的最快方式是本文中描述的辅助函数: http://social.msdn.microsoft.com/Forums/en/vsto/thread/5cfc24cd-cbeb-4583-b6c8-ad1521e31267

如果你拥有的只是一个数组,那么你可以直接将数组分配给一个范围的value2,并且它可以相当快地填充。

您可以设置Application.EnableEvents = False和Application.ScreenUpdating = False以显着加快您的过程。请记住在此过程后重置它们。

答案 1 :(得分:0)

不是为每个(L,C)对进行单独的存储过程调用,而是进行一次调用以获取表中的所有对。希望没有阻止这种情况发生的先决条件。否则,由于单独的SQL调用开销,您将无法将数据恢复到< 3秒。如果可以,将数据拉入SqlDataReader。

接下来,根据获取的数据中的(L,C)关系填充2D数组变量。 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;

与逐个设置单元格值相比,这应该是最快的方式。