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

C# 使用C以编程方式获取最后填充的excel行#,c#,excel,C#,Excel,我正在尝试使用Microsoft.interop.excel库和C#以编程方式获取excel工作表的最后一行。我想这样做,因为我负责遍历excel电子表格的所有记录并对其执行某种操作。具体来说,我需要最后一行的实际数字,因为我将把这个数字放入函数中。有人知道怎么做吗?这是Excel中的常见问题 下面是一些C#代码: 发现 或使用SpecialCells Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeL

我正在尝试使用Microsoft.interop.excel库和C#以编程方式获取excel工作表的最后一行。我想这样做,因为我负责遍历excel电子表格的所有记录并对其执行某种操作。具体来说,我需要最后一行的实际数字,因为我将把这个数字放入函数中。有人知道怎么做吗?

这是Excel中的常见问题

下面是一些C#代码:

发现

或使用
SpecialCells

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);
[编辑]类似的线程:

两种方式

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


对于涉及Excel对象模型的问题,首先在VBA中尝试它通常更容易,然后转换为C#则相当简单

在这种情况下,在VBA中执行此操作的一种方法是:

Worksheet.UsedRange.Row + Worksheet.UsedRange.Rows.Count - 1
是最适合我的。我在末尾添加了一点(
.Row
),因此我不仅返回了一个
范围
,还返回了一个
整数

int lastRow = wkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row;

我唯一能让它在所有场景下工作的方法(受保护的工作表除外):

它支持:

  • 扫描隐藏行/列

  • 忽略没有数据/公式的格式化单元格

代码:


ActiveSheet.UsedRange.Value
返回
[行,列]
的二维对象数组。检查两个维度的长度将提供
LastRow
索引和
LastColumn
索引。下面的示例使用C#


当可能存在空单元格时,此问题更为严重。但即使只填充了一个值,也必须读取一行。当有很多未填充的单元格时,可能需要一段时间,但如果输入接近正确,则速度相当快

我的解决方案忽略完全空的行,并返回最长列的行数:

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;
    }
private static int GetLastRow(工作表)
{
int lastUsedRow=1;
范围=工作表.UsedRange;
对于(int i=1;i0;j--)
{
如果(lastUsedRow
对于那些使用SpecialCells方法的人(我不确定其他人),请注意,如果您的最后一个单元格是合并的,您将无法使用Range.row and 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 };
    }

如前所述,上述技术(xlCellTypeLastCell等)并不总能提供预期的结果。虽然通过一个列来检查值并不困难,但有时您可能会发现在后续行中有空的数据或行。直接使用Excel时,查找最后一行的一个好方法是按CTRL+Down Arrow几次(对于XLSX工作表,您将在第1048576行结束),然后按CTRL+up Arrow选择最后填充的单元格。如果在录制宏时在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之前直接导航到电子表格中的最后一行),但它似乎更可靠。

正如CtrlDot和Leo Guardian所说,这种方法不是很精确,有些文件的格式会影响“特殊单元格”

所以我把这两种方法结合起来,再加上一段时间

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

不确定第一个选项将如何工作。。。但是第二个看起来很有趣。如何将其转换为int值?我编辑了我的代码,我还没有测试该代码,但希望这能让您了解您想要实现的目标。此答案为您提供工作表UsedRange中的最后一个单元格。然而,问题是UsedRange从未签订合同。如果A1和AA100中有值,则删除AA100的内容,UsedRange仍将是A1:AA100。AA100仍将被视为最后一个电池。完美的解决方案,给了我我想要的needed@CtrlDot这是一个非常有效的观点,UsedRange不能像预期的那样工作,不能被信任xlCellTypeLastCell方法也不能。精彩的答案(也是唯一一个对我有效的答案)。这是有效的,我一直在努力获得正确的行。方法1有效。方法2-不可靠的已删除旧单元格被UsedRange“标记”,并且“xlCellTypeLastCell”被标记为“脏”,并且仍然认为这些单元格仍在使用中,并将空单元格报告为“已使用”挽救了我的一天!谢谢不可靠的已删除旧单元格被UsedRange“标记”,而“xlCellTypeLastCell”被标记为“脏”,并且仍然认为这些单元格仍在使用中,并将空单元格报告为“已使用”
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;
    }
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 };
    }
    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;
    }
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;
}