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

时间:2010-02-25 10:16:37

标签: c# excel vsto

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

9 个答案:

答案 0 :(得分:78)

范围是多个单元格:

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];

答案 1 :(得分:16)

如果在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;

答案 2 :(得分:2)

你可以像这样检索价值

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

选择整个使用范围

Excel.Range range = xlWorkSheet.UsedRange;

来源:

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

燃烧

答案 3 :(得分:1)

面对同样的问题,我发现最快的解决方案是实际扫描我想要排序的单元格行,用非空白元素确定最后一行,然后选择并对该分组进行排序。

    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

答案 4 :(得分:1)

如果收到错误消息,指出“对象不包含get_range的定义”。

尝试关注。

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

答案 5 :(得分:0)

我找到了一个好的简短方法似乎运作良好......

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

在这个例子中,我们选择3列和5行,然后将“Tada”放入单元格中。

答案 6 :(得分:0)

UsedRange可与“virgins”单元格配合使用,但如果您的单元格在过去已填充,则UsedRange会向您提供旧值。

例如:

“在包含 A1 A5 单元格的Excel工作表中进行思考”。在这种情况下,UsedRange必须实现为:

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

在执行这几行之后,Watch to SheetRows变量必须显示值5。

  

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

     

A1:SheetRows的值为5

     

Q2:为什么会这样?

     

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

     

获取一个代表所有的Microsoft.Office.Interop.Excel.Range对象   任何时候都包含值的单元格。

所以,问题是:是否存在针对此行为的一些/任何解决方法?

我认为有两种选择:

  1. 避免删除单元格的内容,更喜欢删除整行(右键单击行号,然后“删除行”。
  2. 使用CurrentRegion代替UsedRange属性,如下所示:
  3. Long SheetRows;
    SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;
    

答案 7 :(得分:0)

如果您想要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;

答案 8 :(得分:-1)

尝试一下,行得通!

Excel.Worksheet sheet = xlWorkSheet;
Excel.Series series1 = seriesCollection.NewSeries();
Excel.Range rng = (Excel.Range)xlWorkSheet.Range[xlWorkSheet.Cells[3, 13], xlWorkSheet.Cells[pp, 13]].Cells;
series1.Values = rng;