我必须根据以下方案从SQL Server填写Excel范围
C1 C2 C3....C29
L1
L2
L3
L4
L5
.....
L120
我想知道什么是获取每对(Li,Cj)
对应的每个值的最快方法,这个值存储在SqlServer中?
我无法遍历每个单元格。
你的解决方案可能是什么?
我必须说我设法在不到3秒的时间内检索这些数据
答案 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;
与逐个设置单元格值相比,这应该是最快的方式。