17

I'm using ClosedXML with C# to modify an Excel workbook. I need to find the last row number used but .RowCount() counts how many rows are in the worksheet. So it is returning 1 million rows when there are only a few thousand. I have tried LastRowUsed() but that doesn't return an int and there is no .row method for it. How can I get the last row in an int?

1
  • 1
    Daniel, I think you marked the wrong comment as the answer. Commented Jan 2, 2018 at 13:33

5 Answers 5

37

The LastRowUsed() function returns a row object. Use

worksheet.LastRowUsed().RowNumber()

to get the number of the last row used.

Sign up to request clarification or add additional context in comments.

Comments

12

You could use RowsUsed();

var wb = new XLWorkbook();
    var ws = wb.worksheets.add("data");
    var totalRows = ws.RowsUsed().Count();

4 Comments

And then from there you can figure out which row is the last row.
Other answers are better.
This doesn't work as expected when there are hidden rows. @Raidri answer is the perfect answer for this question.
This is not dangerous with hidden rows only, but also when there are empty rows as well. I tried this first and wondered why the end was cut off sometimes. Any row without a used cell will not count. Yes, .LastRowUsed().RowNumber() does a much better job.
5

You have to use .LastRowUsed()

More useful stuff from official GitHub repo:

range.FirstCell()
range.FirstCellUsed()
range.FirstColumn()
range.FirstColumnUsed()
range.FirstRow()
range.FirstRowUsed()

range.LastCell()
range.LastCellUsed()
range.LastColumn()
range.LastColumnUsed()
range.LastRow()
range.LastRowUsed()

1 Comment

Just be careful not to use the functions "range.Last..." in a big loop, since they can be slow. Assign the value you need in a variable and use that variable in your loop. As in IXLCell MyLastCellUsed = ws.LastCellUsed;
1

I had this problem.

This example has the best performance:

XLWorkbook workbook = new XLWorkbook(FilePath);
// row count
var rowCount = workbook.Worksheet(1).LastRowUsed().RowNumber();
// column count
var columnCount = workbook.Worksheet(1).LastColumnUsed().ColumnNumber();

or

XLWorkbook workbook = new XLWorkbook(FilePath);
// row count
var rowCount = workbook.Worksheet(1).RowsUsed().Count();
// column count
var columnCount = workbook.Worksheet(1).ColumnUsed().Count();

I hope this helps you

1 Comment

These two are not equivalent, see github.com/ClosedXML/ClosedXML/issues/2604
0

I used this code

libro = new XLWorkbook("file.xlsx");
hoja = libro.Worksheet(1);
var primeraCeldaUsada = hoja.FirstCellUsed();
var ultimaCeldaUsada = hoja.LastCellUsed();
var rango = hoja.Range(primeraCeldaUsada.Address, ultimaCeldaUsada.Address);
int ultfila = int.Parse(ultimaCeldaUsada.Address.RowNumber.ToString());
for (int i = 7; i <= ultfila; i++)
    {
    hoja.Cell(i, 3).Value = hoja.Cell(i, 3).Address.ToString();
    }

2 Comments

Please avoid posting code only answers. Please add some explenation to your code, what it does and why you use this code.
Recorre la columna "i", desde la fila 7 hasta la ultima celda usada y en cada una agrega la posición en curso.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.