web-dev-qa-db-ja.com

null参照でランタイムバインディングを実行できません-空のExcelセル

タイトルに記載されているエラーを修正する方法を考えることができないようで、何をすべきかについていくつかのアイデアを探していました。

Excelスプレッドシートの行をオブジェクトに読み込もうとしています。

最初にループするとき、行1、列1および行1の列2にデータがあるため、問題はありません。

しかし、行2、列1、行2の列2に到達すると、スプレッドシートのこれらのセルが「空」であるため、上記のエラーが発生します。

「nullの場合」のチェックをどこに入れることができるのか、私にはわかりません。

誰でもそれを行う方法を提案できますか?

これが私のコードです...

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

.ToString()を使用しないでください。値がnullの場合、_null reference exception_が発生します。 Convert.ToString()を使用すると、null値に対して空の文字列が返されます。

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

ToStringを呼び出す前に必要です。空の行を追加することは役に立たないと思うので、追加する前であれば移動することもできますが、シナリオには当てはまらない場合があります。

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

そうでなければ、これはおそらくあなたが必要とするものです:

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

例外の背後にある理由は、Value2dynamicであるため、戻り値は実行時に決定されます。で、もし Value2nullなので、呼び出すToStringメソッドを決定できません。

3
Patrick Hofman

Forループで内部をチェックできます:

    //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