使用C#以编程方式获取最后填充的excel行

时间:2011-10-06 13:00:54

标签: c# excel

我正在尝试使用Microsoft.interop.Excel Library和C#以编程方式获取excel表的最后一行。我想这样做,因为我负责循环遍历excel电子表格的所有记录并对它们执行某种操作。具体来说,我需要最后一行的实际数字,因为我将这个数字抛入一个函数。任何人都知道如何做到这一点?

10 个答案:

答案 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)

如前所述,上述技术(xlCellTypeLastCell等)并不总是提供预期的结果。尽管通过检查值的列进行迭代并不困难,但有时您可能会发现有空单元格或行,其中包含要在后续行中考虑的数据。直接使用Excel时,查找最后一行的一种好方法是多次按CTRL +向下箭头(对于XLSX工作表,您将在行1048576处结束),然后按CTRL +向上箭头,将选择最后一行填充的单元格。如果在录制宏的同时在Excel中执行此操作,则将获得复制该代码的代码,然后只是使用Microsoft.Office.Interop.Excel库针对C#对其进行调整的一种情况。例如:

    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;
}