【问题标题】:How do I get an Excel range using row and column numbers in VSTO / C#?如何使用 VSTO / C# 中的行号和列号获取 Excel 范围?
【发布时间】:2010-02-25 10:16:37
【问题描述】:

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

【问题讨论】:

  • 我会开始单击对您有帮助的答案上的复选标记。如果您的百分比较低,人们不太可能提供帮助。
  • 选择一个答案 +Dan Crowther。人们应该得到积分。
  • @Wartickler 如果您查看他的个人资料页面,您会发现他最后一次出现在 SO 上是在 2010 年。我认为在可预见的未来他不太可能接受任何答案:- (
  • +Dan Crowther 的个人资料也显示他为“未注册”.. 猜猜他出局了

标签: c# excel vsto


【解决方案1】:

范围是多个单元格:

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
  • [1, 1] 和[3, 3] 中的哪一行是行哪一列?
  • @mirabilos dynamic Range[[object RowIndex], [object ColumnIndex]]
  • Excel.Worksheet 没有get_Range 方法(我在VS 2010中使用C#)
  • @EgorSkriptunoff 在 VB.Net 中你可以在 Excel.Worksheet 上使用 Range,在 C# 中可能是一样的
【解决方案2】:

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

【讨论】:

  • 我使用的是 15.0 版,它也没有 get_range,谢谢 tic,这段代码对我来说很好用
【解决方案3】:

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

尝试关注。

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

【讨论】:

    【解决方案4】:

    你可以像这样检索值

    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

    燃烧

    【讨论】:

      【解决方案5】:

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

          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
      

      【讨论】:

        【解决方案6】:

        我找到了一个很好的简短方法,似乎效果很好......

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

        在本例中,我们选择上方 3 列和下方 5 行,然后将“Tada”放入单元格中。

        【讨论】:

          【解决方案7】:

          UsedRange 可以很好地处理“处女”单元格,但如果您的单元格是过去填充的,那么 UsedRange 将为您提供旧值。

          例如:

          “在 Excel 工作表中思考,其中的单元格 A1 到 A5 填充有文本”。在这种情况下,UsedRange 必须实现为:

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

          在这几行执行后,SheetRows 变量的监视必须显示值 5。

          Q1:但是,如果A5的值被删除会怎样?

          A1:SheetRows 的值为 5

          Q2:为什么会这样?

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

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


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

          我认为有两种选择:

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

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

          【讨论】:

            【解决方案8】:

            如果你想喜欢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;
            

            【讨论】:

            • 感谢 sinsedrix!
            • 而Column就是这样的吧?然后,如果您另外使用 UsedRange foreach,逐行、逐列检查,您可能会得到像“new UsedRange”一样不知道行/列是最后一行/列。
            【解决方案9】:

            试试这个,有效!

            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;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多