【问题标题】:Get the last cell (column, row) of a Excel range object获取 Excel 范围对象的最后一个单元格(列、行)
【发布时间】:2016-07-06 22:03:51
【问题描述】:

我有一个Microsoft.Office.Interop.Excel.Range 对象并想估计该范围的结束坐标,即(最后一列,最后一行)。

没有像LastColLastRow 这样的属性。唯一的属性是 ColumnRow,它们指定 first 单元格。但是如何获取范围的最后一个单元格?

【问题讨论】:

  • Columns.Count, Rows.Count
  • Columns.Count 和 Rows.Count 将适用于连续范围。对于非连续范围(例如“D1:E3,A1:B3”),您需要使用 Areas 属性。

标签: c# excel vsto


【解决方案1】:

有两种方法可以做到这一点:

  1. 使用Worksheet.UsedRange 确定范围。这将为您提供类似 A1:F10 的范围,或使用 Worksheet.UsedRange.SpecialCells(IExcel.XlCellType.xlCellTypeLastCell) 获取 F10

  2. 使用Range.End[IExcel.XlDirection]属性,返回指定方向上最后一个连续的非空单元格。请注意,如果 Range 为空,它将返回给定方向上的第一个非空单元格或最后一个单元格(当 excel 到达其边界时)。例如:整个 A 列为空,Range["A1"].End[IExcel.XlDirection.xlDown] 将为 A65535(excel 97-2003 中的最后一行,A1048576 为 excel 2007)

//Just In case if you are wondering what IExcel is
using IExcel = Microsoft.Office.Interop.Excel;

【讨论】:

    【解决方案2】:

    这应该得到范围的第一个和最后一个单元格:

    1. 启动 Excel。

    2. 打开工作簿。

    3. 选择你的范围,在这种情况下,我得到了活动工作表的使用范围。

    4. 调用范围的get_address方法。

    5. 将get_address的结果用冒号分割。

    6. 拆分产生的数组的第一个值将具有起始单元格。

    7. 拆分产生的数组的第二个值将具有结束单元格。

    8. 将美元符号替换为空,您将获得范围的开始和结束单元格。

      Microsoft.Office.Interop.Excel.Application excel = new Application();
      Microsoft.Office.Interop.Excel.Workbook workBook =
          excel.Workbooks.Open(fileLocation);
      Microsoft.Office.Interop.Excel.Worksheet sheet = workBook.ActiveSheet;
      Microsoft.Office.Interop.Excel.Range range = sheet.UsedRange;
      string address = range.get_Address();
      string[] cells = address.Split(new char[] {':'});
      string beginCell = cells[0].Replace("$", "");
      string endCell = cells[1].Replace("$", "");
      workBook.Close(true);
      excel.Quit();
      

    如果您希望最后一列和最后一行相对于范围的开头,您可以执行以下操作:

        int lastColumn = range.Columns.Count;
        int lastRow = range.Rows.Count;
    

    【讨论】:

      【解决方案3】:

      使用 Excel 2013,我们遇到过很多情况,UsedRangexlCellTypeLastCell 只是给出了可怕的错误值。

      例如,我们有一个仅包含 7 列的工作表,有时这两个函数会告诉我们的 C# 代码有 16,000 多列数据。

      我发现真正找出包含数据的右下角单元格的唯一方法是使用此建议中的提示:

      sheet.Cells.Find()

      【讨论】:

      • 我也遇到过这种情况。由于.SpecialCells(XlCellType.xlCellTypeLastCell) 返回工作表对象的UsedRange 属性的最后一个“已使用”单元格,而不是调用它的 Range 对象的最后一个单元格,因此这些值似乎很偏离。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2021-05-22
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多