Получение последней строки Excel в данном листе имеет много хороших ответов здесь .Однако иногда все, что нам нужно, это последняя строка данного столбца, а не всей таблицы.
Я подумал о решении, которое кажется немного медленным:
- найтипоследняя строка в 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";
Вопрос:
Есть идеи, чтобы избежать зацикливания?В vba решение выглядит довольно привлекательно в 1 строку:
lastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row
Что-нибудь похожее для C # Excel Interop?