web-dev-qa-db-fra.com

Impossible d'exécuter la liaison d'exécution sur une référence nulle - Cellules Excel vides

Je n'arrive pas à penser à un moyen de corriger l'erreur mentionnée dans le titre et je cherchais des idées sur ce qui devrait être fait.

J'essaie de lire les lignes d'une feuille de calcul Excel dans un objet.

La première fois qu'il boucle, je n'ai aucun problème car la ligne 1, la colonne 1 et la ligne 1 colonne 2 contiennent des données.

Mais quand il arrive à la ligne 2, à la colonne 1 et à la ligne 2, la colonne 2 tombe avec l'erreur ci-dessus car les cellules de la feuille de calcul sont "vides"

Je ne peux tout simplement pas déterminer où je peux insérer des vérifications "si nulles".

Quelqu'un peut-il suggérer comment le faire s'il vous plaît?

Voici mon 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()
                });
            }
        }
    }
9
Trevor Daniel

N'utilisez pas .ToString() cela entraînera null reference exception Lorsque la valeur est nulle. Utilisez Convert.ToString(), il renverra une chaîne vide pour la valeur nulle.

col1 = Convert.ToString(row.Cells[i + 1, 1].Value2);
col2 = Convert.ToString(row.Cells[i + 1, 2].Value2);
27
Saravana Kumar

Vous en avez besoin avant l'appel à ToString. Peut-être que vous pouvez même vous déplacer avant l'ajout, car je pense qu'il n'est pas utile d'ajouter des lignes vides, mais cela pourrait ne pas être vrai dans votre scénario:

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

Sinon, c'est probablement ce dont vous avez besoin:

col1 = row.Cells[i + 1, 1].Value2 != null ? row.Cells[i + 1, 1].Value2.ToString() : null,

La raison de l'exception est que Value2 est un dynamic, donc la valeur de retour est déterminée lors de l'exécution. Et si Value2 est null, il ne peut pas déterminer la méthode ToString à appeler.

3
Patrick Hofman

Vous pouvez vérifier l'intérieur de la boucle:

    //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();
        }
            });
        }
    }
0
vignesh