每个特定列使用C#获取最后填充的excel行

时间:2019-04-09 16:51:44

标签: c# excel office-interop excel-interop

获取给定工作表中的最后Excel行有很多nice answers here。 但是,有时我们所需的只是给定列的最后一行,而不是整个电子表格。

我想到了一个解决方案,它似乎有点慢:

  • 在Excel中为所有列查找最后一行;
  • 在特定列中从那里开始循环到1,尝试查找不为空的第一个单元格。这就是结果;
  • 对于空的第一行以及给定列中仅第一行,始终返回1;

这是实现:


namespace ExcelTest
{
    using System;
    using Excel = Microsoft.Office.Interop.Excel;

    public class Startup
    {
        const string filePath = @"C:\Users\gropc\Desktop\Sample.xlsx";

        static void Main()
        {
            Excel.Application excel = new Excel.Application { Visible = true, EnableAnimations = false };
            Excel.Workbook wkb = Open(excel, filePath);

            foreach (Excel.Worksheet wks in wkb.Worksheets)
            {
                int lastRowA = LastRowPerColumn(1, wks);
                int lastRowB  = LastRowPerColumn(2, wks);
                int lastRowC = LastRowPerColumn(3, wks);
                Console.WriteLine($"{lastRowA} - {lastRowB} - {lastRowC}");
            }

            wkb.Close(true);
            excel.Quit();
        }

        static int LastRowPerColumn(int column, Excel.Worksheet wks)
        {
            int lastRow = LastRowTotal(wks);
            while (((wks.Cells[lastRow, column]).Text == "") && (lastRow != 1))
            {
                lastRow--;
            }
            return lastRow;
        }

        static int LastRowTotal(Excel.Worksheet wks)
        {
            Excel.Range lastCell = wks.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
            return lastCell.Row;
        }

        static Excel.Workbook Open(Excel.Application excelInstance,
            string fileName, bool readOnly = false,
            bool editable = true, bool updateLinks = true)
        {
            return excelInstance.Workbooks.Open(fileName, updateLinks, readOnly);
        }
    }
}

依赖项:

  • using Excel = Microsoft.Office.Interop.Excel;
  • const string filePath = @"C:\Users\gropc\Desktop\Sample.xlsx";

问题:

有什么想法可以避免循环吗?在中,该解决方案在1行中非常吸引人:

lastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row

与C#Excel Interop类似吗?

0 个答案:

没有答案