我正在尝试使用Microsoft.interop.Excel Library和C#以编程方式获取excel表的最后一行。我想这样做,因为我负责循环遍历excel电子表格的所有记录并对它们执行某种操作。具体来说,我需要最后一行的实际数字,因为我将这个数字抛入一个函数。任何人都知道如何做到这一点?
答案 0 :(得分:48)
夫妻俩,
using Excel = Microsoft.Office.Interop.Excel;
Excel.ApplicationClass excel = new Excel.ApplicationClass();
Excel.Application app = excel.Application;
Excel.Range all = app.get_Range("A1:H10", Type.Missing);
OR
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);
int lastUsedRow = last.Row;
int lastUsedColumn = last.Column;
答案 1 :(得分:15)
这是Excel中的常见问题。
以下是一些C#代码:
// Find the last real row
nInLastRow = oSheet.Cells.Find("*",System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByRows,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Row;
// Find the last real column
nInLastCol = oSheet.Cells.Find("*", System.Reflection.Missing.Value, System.Reflection.Missing.Value,System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Column;
找到here
或使用SpecialCells
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);
[编辑]类似的主题:
答案 2 :(得分:12)
Pryank's answer是最适合我的。我在最后添加了一点(.Row
),所以我不只是返回range
,而是integer
。
int lastRow = wkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row;
答案 3 :(得分:9)
对于涉及Excel对象模型的问题,首先在VBA中尝试它更容易,然后转换为C#是相当简单的。
在这种情况下,在VBA中执行此操作的一种方法是:
Worksheet.UsedRange.Row + Worksheet.UsedRange.Rows.Count - 1
答案 4 :(得分:6)
我能让它在所有场景中工作的唯一方法(受保护的工作表除外):
它支持:
扫描隐藏的行/列
忽略没有数据/公式的格式化单元格
代码:
// Unhide All Cells and clear formats
sheet.Columns.ClearFormats();
sheet.Rows.ClearFormats();
// Detect Last used Row - Ignore cells that contains formulas that result in blank values
int lastRowIgnoreFormulas = sheet.Cells.Find(
"*",
System.Reflection.Missing.Value,
InteropExcel.XlFindLookIn.xlValues,
InteropExcel.XlLookAt.xlWhole,
InteropExcel.XlSearchOrder.xlByRows,
InteropExcel.XlSearchDirection.xlPrevious,
false,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value).Row;
// Detect Last Used Column - Ignore cells that contains formulas that result in blank values
int lastColIgnoreFormulas = sheet.Cells.Find(
"*",
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
InteropExcel.XlSearchOrder.xlByColumns,
InteropExcel.XlSearchDirection.xlPrevious,
false,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value).Column;
// Detect Last used Row / Column - Including cells that contains formulas that result in blank values
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count;
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;
答案 5 :(得分:2)
ActiveSheet.UsedRange.Value返回[row,column]的二维对象数组。检查两个维度的长度将提供LastRow索引和LastColumn索引。以下示例使用C#。
Excel.Worksheet activeSheet;
Excel.Range activeRange;
public virtual object[,] RangeArray {
get { return ActiveRange.Value; }
}
public virtual int ColumnCount {
get { return RangeArray.GetLength(1); }
}
public virtual int RowCount {
get { return RangeArray.GetLength(0); }
}
public virtual int LastRow {
get { return RowCount; }
}

答案 6 :(得分:0)
当可能存在空单元格时,此问题更糟。但即使只填充了一个值,也必须读取一行。当有很多未填充的单元格时可能需要一段时间,但如果输入接近正确,则相当快。
我的解决方案忽略完全空行并返回最长列的行数:
private static int GetLastRow(Worksheet worksheet)
{
int lastUsedRow = 1;
Range range = worksheet.UsedRange;
for (int i = 1; i < range.Columns.Count; i++)
{
int lastRow = range.Rows.Count;
for (int j = range.Rows.Count; j > 0; j--)
{
if (lastUsedRow < lastRow)
{
lastRow = j;
if (!String.IsNullOrWhiteSpace(Convert.ToString((worksheet.Cells[j, i] as Range).Value)))
{
if (lastUsedRow < lastRow)
lastUsedRow = lastRow;
if (lastUsedRow == range.Rows.Count)
return lastUsedRow - 1;
break;
}
}
else
break;
}
}
return lastUsedRow;
}
答案 7 :(得分:0)
对于那些使用SpecialCells方法的人,(我不确定其他人),请注意,如果你的最后一个单元格合并,你将无法获得最后一行和列号使用Range.Row和Range.Column将最后一行和列作为数字。 你需要首先取消合并你的范围然后再次获得最后一个单元格。 这花了我很多。
private int[] GetLastRowCol(Ex.Worksheet ws)
{
Ex.Range last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing);
bool isMerged = (bool)last.MergeCells;
if (isMerged)
{
last.UnMerge();
last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing);
}
return new int[2] { last.Row, last.Column };
}
答案 8 :(得分:0)
private int GetLastRow()
{
Excel.Application ExcelApp;
ExcelApp = new Excel.Application();
ExcelApp.Selection.End(Excel.XlDirection.xlDown).Select();
ExcelApp.Selection.End(Excel.XlDirection.xlDown).Select();
ExcelApp.Selection.End(Excel.XlDirection.xlDown).Select();
ExcelApp.Selection.End(Excel.XlDirection.xlUp).Select();
return ExcelApp.ActiveCell.Row;
}
这可能不是最优雅的解决方案(我想您可以直接在使用XlUp之前先导航到电子表格中的最后一行),但这似乎更可靠。
答案 9 :(得分:0)
如CtrlDot和Leo Guardian所说,该方法不是很精确,有些文件的格式会影响“ SpecialCells”。
所以我结合使用了它和While。
Range last = sheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
Range range = sheet.get_Range("A1", last);
int lastrow = last.Row;
// Complement to confirm that the last row is the last
string textCell= "Existe";
while (textCell != null)
{
lastrow++;
textCell = sheet.Cells[lastrow + 1, 1].Value;
}