I cannot seem to think of a way to correct the error mentioned in the title and was looking for some ideas on what should be done.
I am trying to read the rows of a excel spreadsheet into an object.
The first time it loops I have no problems because row 1, column 1 and row 1 column 2 have data in them.
But when it gets to row 2, column 1 and row 2 column 2 it falls over with the above error because those cells in spreadsheet are "empty"
I just cannot work out where I can put some "if null" checks in.
Can anyone suggest how to do it please?
Here is my code...
private static void IterateRows(Excel.Worksheet worksheet)
{
//Get the used Range
Excel.Range usedRange = worksheet.UsedRange;
// create an object to store the spreadsheet data
List<SPREADSHEETModel.spreadsheetRow> spreadsheetrows = new List<SPREADSHEETModel.spreadsheetRow>();
//Iterate the rows in the used range
foreach (Excel.Range row in usedRange.Rows)
{
for (int i = 0; i < row.Columns.Count; i++)
{
spreadsheetrows.Add(new SPREADSHEETModel.spreadsheetRow()
{
col1 = row.Cells[i + 1, 1].Value2.ToString(),
col2 = row.Cells[i + 1, 2].Value2.ToString()
});
}
}
}
Do not use .ToString()
it will cause null reference exception
when the value is null.
Use Convert.ToString()
, it will return empty string for the null value.
col1 = Convert.ToString(row.Cells[i + 1, 1].Value2);
col2 = Convert.ToString(row.Cells[i + 1, 2].Value2);
You need them before the call to ToString
. Maybe you can even move if before the adding, since I think it isn't useful to add empty rows, but that might nog be true in your scenario:
if (row.Cells[i + 1, 1].Value2 != null && row.Cells[i + 1, 2].Value2 != null)
{
spreadsheetrows.Add(new SPREADSHEETModel.spreadsheetRow()
{
col1 = row.Cells[i + 1, 1].Value2.ToString(),
col2 = row.Cells[i + 1, 2].Value2.ToString()
});
}
Otherwise this is probably what you need:
col1 = row.Cells[i + 1, 1].Value2 != null ? row.Cells[i + 1, 1].Value2.ToString() : null,
The reason behind the exception is that Value2
is a dynamic
, so the return value is determined on runtime. And if Value2
is null
, it can't determine the ToString
method to call.
You can check inside in for loop:
//Iterate the rows in the used range
foreach (Excel.Range row in usedRange.Rows)
{
for (int i = 0; i < row.Columns.Count; i++)
{
spreadsheetrows.Add(new SPREADSHEETModel.spreadsheetRow()
{
if (row.Cells[i + 1, 1].Value2 != null)
{
col1 = row.Cells[i + 1, 1].Value2.ToString();
}
if (row.Cells[i + 1, 2].Value2 != null)
{
col2 = row.Cells[i + 1, 2].Value2.ToString();
}
if (row.Cells[i + 1, 3].Value2 != null)
{
col3 = row.Cells[i + 1, 3].Value2.ToString();
}
});
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With