2012-03-08 242 views
0

我正在将应用程序从vba转换为C#。它进展缓慢。这是我的第一个挑战......Excel Worksheet.Usedrange返回什么类型返回

在VBA中,我可以在Excel范围分配给VBA二维数组:当我转换为C#

Dim strSheetArray as Variant 
strSheetArray = xlSH.UsedRange 
... 
debug.print strSheetArray[1,2]  'etc. 

的“UsedRange”属性似乎返回目的。我似乎无法像数组那样使用该对象,从而导致代码错误。那么,我该如何引用返回的对象,以便我可以遍历它呢?

而且,只要我在它,细胞没有类型,所以我怎么使用它们(有些是数字,其他的是文字等)。在vba中很容易......

感谢您的帮助。

+0

应该注意到,我正在使用Office Interop。我的vba程序也使用它,从Access2007 .... – 2012-03-08 17:04:46

+0

你在分配'strSheetArray'时没有使用“Set”,所以你实际得到的是Range的默认属性的返回值,是'价值'。与调用'strSheetArray = xlSH.UsedRange.Value'相同请参阅这里了解如何读取C#中的数组,这正是我认为您所追求的目标:http://social.msdn.microsoft.com/Forums/pl/ exceldev/thread/808ec772-cf5b-4589-a8ec-7a01683f7537 – 2012-03-09 00:09:37

回答

2

它返回一个范围接口。你可以阅读更多关于它at MSDN

而且,只要我在它,细胞没有类型,所以我如何使用它们(一些是数字,另一些是文本等)。在vba中很容易...

单元格确实有一个类型,但它们只是对象。您必须投射到您想要的东西。因此,如果电池是文本,你将不得不做这样的事情:

(string)xlSheet.Cells[row,col].Value2 

xlSheet.Cells[row,col].Value2.ToString(); 

你将不得不转换为数字类型,以及如果你知道他们的数字。


基于编辑点评:

所以,如果你想获得的使用范围,你这样做:

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Range range = xlSheet.UsedRange; 

这会给你一切从工作表(我用的变量xlSheet ,这是Excel.Worksheet)。

现在我们可以通过做遍历这个:

int rows = range.Rows.Count; 
int cols = range.Columns.Count; 

for(int r=1; r <= rows; r++) 
{ 
    for(int c=1; c <= cols; c++) 
    { 
     Console.Write(range.Cells[r,c].Value2.ToString()); 
    } 
    Console.WriteLine(); 
} 

这将遍历范围,基本复制什么是在控制台窗口中的电子表格。我希望这有帮助。我还使用C#编写了一篇阅读Excel电子表格的博文,如果需要,您可以阅读here

+0

我错误地提出了这个问题。我想将整个范围都返回到C#多维数组中,因此我避免了数百次到Interop的行程,这些行程相当缓慢。然后,我想完全用数组工作。 我明白如何使用Interop,但是将范围分配给C#中的对象会使我(根据我一直在阅读的内容),一个类型为“System.Object [,]”的对象。现在我该怎么做。智能感知不会让我分配给“Object [,]”类型的变量。 – 2012-03-08 17:27:46

+0

@ JimS-Indy我更新了我的回复。希望这有助于更多。 – Jetti 2012-03-08 17:37:29

+0

,但它不适用于Excel工作表合并单元格的情况 – 2013-03-21 17:41:35