2010-02-18 88 views
4

我想從C#讀取使用COM的Excel文件,並且可以打開並加載它。但是,我不想使用表格中的所有數據(每月展開一次),只是從表格頂部開始的某個子集(第3行用於標題,第4行用於數據)並且結束。我目前可以得到一個代表整個數據集的範圍爲Excel.Worksheet.UsedRange,但接下來我需要將其操作到所需的範圍,或者(最好)找到終點以進入我的實際數據檢索的另一個範圍。任何人都可以告訴我怎麼做這些?謝謝。需要在C#中查找Excel範圍的起點和終點#

+0

讓我知道如果你需要更多的幫助,我的回答,我沒」 t確定您的Excel體驗深度 – 2010-02-18 18:43:08

+0

您能否在您的問題中更具體,您究竟需要什麼? UsedRange返回適當的範圍,你只是想調整它? – 2010-02-18 18:51:42

+0

斯坦,那完全正確。我不希望整個範圍,只是終點,所以我可以用我自己的起點。 – 2010-02-18 19:12:41

回答

6

我不確定你在做什麼。但這裏有一些例子。

假設我有以下範圍:

Excel.Worksheet sheet = this.Application.ActiveSheet as Excel.Worksheet; 
Excel.Range range = sheet.get_Range("A1", "B5") as Excel.Range; 

下移到你的範圍由n - 值行:

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

Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows-n,cols); 
newRange.Select(); //will select the new range will be 1 row lower 

移動你的底行了

Excel.Range newRange = range.get_Resize(rows-n,cols); 
newRange.Select(); //will select the new range will be 1 row higher 

我假設你可以弄清楚如何將它左右移動。

get_Offset()將移動整個範圍,然後您需要調整範圍的大小。

編輯:現在,我知道你想要什麼。

要選擇最後一個單元格:

Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range; 
lastCell.Select(); 

現在你可以使用自己的出發點,像這樣:

Excel.Range newRange = sheet.get_Range("B1", lastCell); 
newRange.Select(); 
+0

你回答了你自己的問題,但我仍然認爲這個答案對你長期有用。 – 2010-02-18 19:06:46

+0

是的,當我知道我想要去的位置時,這非常棒,但是當我不知道它會是什麼時,我試圖找到最後的數據位置。 – 2010-02-18 19:09:06

+0

@Tom,請看看我的更新的答案,它會顯示如何做你想做的,沒有get_Address。 – 2010-02-18 19:21:03

1

MSDN

「使用完屬性,與來自XlDirection枚舉(xlUp,xlToRight,xlToLeft,xlDown),一個值一起檢索表示在該區域的端部的細胞的範圍內,就好像你按下了枚舉值所描述的鍵;「

rngDown = rng.get_End(Excel.XlDirection.xlDown); 
+0

有沒有這樣的方法可用,我想你正在考慮get_End – 2010-02-18 18:46:45

+0

當我嘗試這個,它返回包含工作表(行65536)的結束,而不是UsedRange的結束。 – 2010-02-18 18:50:01

+0

@Stan,是的,你說得對,是的MS網站上的印刷錯誤,謝謝 – 2010-02-18 19:02:46

1

您應該能夠使用Range.RowRange.Rows.CountRange.ColumnRange.Columns.Count性能,讓您範圍的開始和結束,像這樣:

Dim used As Range, first As Range, last As Range 
Set used = Sheet1.UsedRange 
Set first = Sheet1.Cells(used.Row, used.Column) 
Set last = Sheet1.Cells(used.Row + used.Rows.Count, used.Column + used.Columns.Count) 

MsgBox ("First: " + first.Address + " Last: " + last.Address) 

這示例代碼在VBA,但所有這些函數都應該可以在COM中使用C#。

+0

@Joseph,又出現了MS網站上的印刷錯誤,使用get_End代替 – 2010-02-18 19:03:54

+0

確保你要麼選擇一個單元格先,或聯合使用形式 – 2010-02-18 19:04:34

1

好吧,找到了答案(經過近3個小時的總搜索,在這裏問了2個小時),所以會在這裏發佈給其他人。

Excel.Range urange = (Excel.Range)xlWorkSheet.UsedRange; // gives us the actual range
string used = urange.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing));

從MSDN:
public string get_Address (
[OptionalAttribute] Object RowAbsolute,
[OptionalAttribute] Object ColumnAbsolute,
[OptionalAttribute] XlReferenceStyle ReferenceStyle,
[OptionalAttribute] Object External,
[OptionalAttribute] Object RelativeTo
)

這顯然前兩個是真/假標誌,下一個被定義爲Microsoft.Office.Interop.Excel.XlReferenceStyle對象,我猜外部要麼是一個參考外部文件或某種標誌。 RelativeTo,我只能猜測它指的是任意定義的位置,也許是一個範圍對象,也許是一個字符串。不幸的是,MSDN在這個話題上非常稀少,所以我只是在這裏猜測併發布我的猜測。然而,使用這段代碼,因爲我已經發布了,所以我能夠檢索到總的用作「A1:B245」,它給了我正是我想要的,然後我可以通過提取第二部分創建一個新的範圍,然後可以繼續。

+0

這工作完美!不知道爲什麼更多的人沒有看過這個。 – 2013-04-17 14:20:34