我有一个Microsoft.Office.Interop.Excel.Range
对象,想估计该范围的结束坐标,即(最后一列,最后一行)。
没有像LastCol
,之类的属性LastRow
。唯一的属性是Column
and Row
,它们指定第一个单元格。但是我怎样才能得到范围的最后一个单元格呢?
我有一个Microsoft.Office.Interop.Excel.Range
对象,想估计该范围的结束坐标,即(最后一列,最后一行)。
没有像LastCol
,之类的属性LastRow
。唯一的属性是Column
and Row
,它们指定第一个单元格。但是我怎样才能得到范围的最后一个单元格呢?
有两种方法可以做到这一点:
用于Worksheet.UsedRange
确定范围。这将为您提供A1:F10 之类的范围,或用于Worksheet.UsedRange.SpecialCells(IExcel.XlCellType.xlCellTypeLastCell)
获取F10。
使用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;
这应该得到范围的第一个和最后一个单元格:
启动 Excel。
打开工作簿。
选择您的范围,在这种情况下,我得到了活动工作表的使用范围。
调用范围的 get_address 方法。
在冒号上拆分 get_address 的结果。
拆分产生的数组的第一个值将具有起始单元格。
拆分产生的数组的第二个值将具有结束单元格。
将美元符号替换为空,您将拥有该范围的开始和结束单元格。
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,我们遇到了很多情况,UsedRange
并且xlCellTypeLastCell
只是给出了可怕的错误值。
例如,我们有一个只包含 7 列的工作表,有时这两个函数会告诉我们的 C# 代码有 16,000 多列数据。
我发现真正解决包含数据的右下角单元格的唯一方法是使用此建议中的提示: