2011-07-01 43 views
20

我正在使用C#来操作Excel工作表。以下两段代码应该工作相同,但其中一段可以工作,另一段会引发异常。我想知道为什么。工作表get_Range抛出异常

这工作:

oRange = (Excel.Range)oSheet.get_Range("A1","F1"); 
oRange.EntireColumn.AutoFit(); 

这将引发异常:

oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]); 
oRange.EntireColumn.AutoFit(); 

例外:

RuntimeBinderException occurred. "object" does not contain a definition for 'get_Range' 

oSheet被实例如下:

Excel.Worksheet oSheet = new Excel.Worksheet(); 

我应该实例化两个不同吗?

+0

看起来,“oSheet”曾经作为工作表输入,一次以Object的形式输入。 – TcKs

+0

同意以上所述。你能发布两种情况下oSheet是如何实例化的吗? – DoctorMick

+0

@Tcks,@DoctorMick,发布代码 – KMC

回答

32

它看起来像从oSheet.Cells[1, 1]oSheet.Cells[4, 4]作为参数get_range引发异常。

应用以下,没有会抛出异常:

Excel.Range c1 = oSheet.Cells[1, 1]; 
Excel.Range c2 = oSheet.Cells[4, 4]; 
oRange = (Excel.Range)oSheet.get_Range(c1, c2); 
oRange.EntireColumn.AutoFit(); 

因此,它可能涉及到oSheet.get_Range功能。它接收一个对象作为参数,因此它可能试图调用参数的get_Range方法来接收内部单元格,而从Range向上编译为由编译器完成的对象可能会隐藏方法调用。

如果您需要按行/列定义单元格,请尝试使用上述方法。

+0

可以进一步缩小为oRange =(Excel.Range)oSheet.get_Range(oSheet.Cells [1,1] as Excel.Object,oSheet.Cells [4,4] as Excel 。目的); oRange.EntireColumn.AutoFit(); – prabhakaran

18

改为使用Worksheet Range属性。 例如,代替

oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]); 

使用

oRange = (Excel.Range)oSheet.Range[oSheet.Cells[1, 1],oSheet.Cells[4,4]]; 

我所用的get_Range()方法广泛当我杠杆断.NET 2.当我改变到.NET 4客户端配置文件,我这个例外也是。用Range属性替换get_Range()引用为我解决了这个问题。

+0

NirMH的解决方案为我工作,但我更喜欢这个(也适用) –

+1

显然,问题是与框架4。我在3.5,和Get_range工作正常。现在,在.net4下,get_range将无法工作,并且使用Sheet.Range []可以正常工作 – Simon

2

对于每个有此问题的人,最好使用显式转换,而不是创建新变量。

oRange = (Excel.Range)oSheet.get_Range((Excel.Range)oSheet.Cells[1, 1], (Excel.Range)oSheet.Cells[4,4]); 
1

我已将VS C#项目从.NET Framework 3.5升级到4.5。 一旦我升级成功,当试图生成excel报告时,我得到这个“对象”不包含'get_Range'异常的定义。

我做什么,而不是使用下面的代码

range = xlSheet.get_Range(Cells[xlRow, xlCol], Cells[xlRow, xlCol]); 

我改写到

range = xlSheet.Range[Cells[xlRow, xlCol], xlSheet.Cells[xlRow, xlCol]]; 

和它的工作。