2012-03-08 152 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