如何使用VSTO / C#中的行号和列号来获取Excel范围?

我认为这个问题总结了一下。 给定行和列的两个整数或范围的两个angular的行和列的四个整数,如何获得该范围的范围对象。

如果范围是多个单元格:

Excel.Worksheet sheet = workbook.ActiveSheet; Excel.Range rng = (Excel.Range) sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[3,3]); 

范围是一个单元格的地方:

 Excel.Worksheet sheet = workbook.ActiveSheet; Excel.Range rng = (Excel.Range) sheet.Cells[1, 1]; 

如果在Microsoft Excel 14.0对象库中使用给定的答案将引发错误。 对象不包含get_range的定义。 反而使用

 int countRows = xlWorkSheetData.UsedRange.Rows.Count; int countColumns = xlWorkSheetData.UsedRange.Columns.Count; object[,] data = xlWorkSheetData.Range[xlWorkSheetData.Cells[1, 1], xlWorkSheetData.Cells[countRows, countColumns]].Cells.Value2; 

你可以像这样检索值

 string str = (string)(range.Cells[row, col] as Excel.Range).Value2 ; 

select整个使用的范围

 Excel.Range range = xlWorkSheet.UsedRange; 

资源 :

http://csharp.net-informations.com/excel/csharp-read-excel.htm

炽盛

面对同样的问题,我发现最快的解决scheme是实际扫描我希望sorting的单元格的行,确定最后一行非空元素,然后select和sorting该分组。

  Dim lastrow As Integer lastrow = 0 For r = 3 To 120 If Cells(r, 2) = "" Then Dim rng As Range Set rng = Range(Cells(3, 2), Cells(r - 1, 2 + 6)) rng.Select rng.Sort Key1:=Range("h3"), order1:=xlDescending, Header:=xlGuess, DataOption1:=xlSortNormal r = 205 End If Next r 

我发现了一个很好的简短方法,似乎很好…

 Dim x, y As Integer x = 3: y = 5 ActiveSheet.Cells(y, x).Select ActiveCell.Value = "Tada" 

在这个例子中,我们select了3列和5行,然后在单元格中放置“Tada”。

UsedRange可以和“virgins”单元一起工作,但是如果你的单元格填满了过去,那么UsedRange会为你提供旧的值。

例如:

“在Excel工作表中考虑单元格A1A5填充文本”。 在这种情况下, UsedRange必须实现为:

 Long SheetRows; SheetRows = ActiveSheet.UsedRange.Rows.Count; 

在执行这几行之后,一个监视SheetRowsvariables的值必须显示为5。

Q1:但是,如果A5的值被删除,会发生什么?

A1:SheetRows的值是5

Q2:为什么呢?

A2:因为MSDN定义UsedRange属性为:

获取一个Microsoft.Office.Interop.Excel.Range对象, 对象表示 随时包含值的 所有 单元格


所以,问题是:存在这种行为的一些/任何解决方法?

我认为在2个select:

  1. 避免删除单元格内容,宁愿删除整行(右键单击行号,然后“删除行”。
  2. 使用CurrentRegion而不是UsedRange属性如下:

 Long SheetRows; SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count; 

如果你想像Cells(Rows.Count, 1).End(xlUp).Row ,你可以这样做。

只需使用下面的代码:

 using Excel = Microsoft.Office.Interop.Excel; string xlBk = @"D:\Test.xlsx"; Excel.Application xlApp; Excel.Workbook xlWb; Excel.Worksheet xlWs; Excel.Range rng; int iLast; xlApp = new Excel.Application(); xlWb = xlApp.Workbooks.Open(xlBk, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1); iLast = xlWs.Rows.Count; rng = (Excel.Range)xlWs.Cells[iLast, 1]; iLast = rng.get_End(Excel.XlDirection.xlUp).Row;