获取Excel区域对象的最后一个单元格(列、行)

本文关键字:单元格 最后一个 Excel 区域 对象 获取 | 更新日期: 2023-09-27 18:20:48

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

不存在类似LastColLastRow的属性。唯一的属性是ColumnRow,它们指定第一个单元格。但是我怎样才能得到这个范围的最后一个单元格呢?

获取Excel区域对象的最后一个单元格(列、行)

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

  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中的最后一行,excel 2007中的A1048576

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

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

  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;

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

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

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

sheet.Cells.Find()