2015-01-30 10 views
6

Non riesco a pensare a un modo per correggere l'errore menzionato nel titolo e stavo cercando alcune idee su cosa dovrebbe essere fatto.Impossibile eseguire il binding in fase di esecuzione su un riferimento null - Empty Excel Cells

Sto cercando di leggere le righe di un foglio di calcolo Excel in un oggetto.

La prima volta che esegue il ciclo non ho problemi perché la riga 1, la colonna 1 e la riga 1 colonna 2 contengono dati.

Ma quando si arriva alla riga 2, colonna 1 e riga 2, colonna 2 cade sopra con l'errore precedente perché quelle cellule in foglio sono "vuote"

proprio non può lavorare fuori dove posso mettere qualche " se nulla "controlla.

Qualcuno può suggerire come farlo per favore?

Ecco il mio codice ...

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

risposta

17

Non utilizzare .ToString() causerà null reference exception quando il valore è nullo. Utilizzare Convert.ToString(), restituirà una stringa vuota per il valore null.

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

Sono andato con questo alla fine - molte grazie! –

+0

Va bene se sto usando '.length?' come, 'Convert.ToString (row.Cells [i + 1, 1] .Value2) .Length'; ??? –

3

ne avete bisogno prima della chiamata a ToString. Forse si può anche spostare se prima l'aggiunta, in quanto penso che non è utile per aggiungere righe vuote, ma che potrebbe essere vero in nog 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() 
    }); 
} 

caso contrario, questo è probabilmente quello che vi serve:

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

Il motivo dietro l'eccezione è che Value2 è un dynamic, quindi il valore di ritorno viene determinato in fase di esecuzione. E se Value2 è null, non è possibile determinare il metodo ToString da chiamare.

+0

come si è notato, il mio scenario è quella riga 2, colonna 3 contiene i dati in esso che io voglio ottenere. ci sono 17 colonne in totale :( –

+0

@TrevorDaniel: Ok, allora vedi il secondo esempio di codice –

+0

Puoi anche dividere quella logica in un metodo se lo usi frequentemente –

0

È possibile verificare interno in ciclo 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(); 
     } 
      }); 
     } 
    } 
Problemi correlati