我有一个Microsoft.Office.Interop.Excel.Range
对象,想要估计该范围的结束坐标,即(最后一列,最后一行)。
没有LastCol
,LastRow
等属性。唯一的属性是Column
和Row
,它们指定第一个单元格。但是如何才能获得该范围的最后一个单元格呢?
答案 0 :(得分:9)
有两种方法可以做到这一点:
使用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;
答案 1 :(得分:7)
这应该得到范围的第一个和最后一个单元格:
启动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;
答案 2 :(得分:0)
使用Excel 2013,我们有很多案例UsedRange
和xlCellTypeLastCell
只是提供了可怕的错误值。
例如,我们的工作表只包含7列,有时这两个函数会告诉我们的C#代码有16,000多列数据。
我发现的唯一真正计算出包含数据的右下角单元格的方法是使用此建议中的提示: