2015-01-30 22 views
6

Başlıkta belirtilen hatayı düzeltmenin bir yolunu düşünmüyorum ve yapılması gerekenler hakkında bazı fikirler arıyordum.Çalışma zamanı bağlama null başvuruda gerçekleştirilemiyor - Boş Excel Hücreleri

Bir excel elektronik tablosunun satırlarını bir nesneye okumaya çalışıyorum.

İlk kez döngülerinde sorun yok çünkü 1. satır, 1. sütun ve 1. satırda 2 sütununda veri var.

Ama elektronik tabloda bu hücrelerin "boş" oldukları için 2, sütun 1 ve satır 2 sütun 2 yukarıdaki hata ile yere düşer satır aldığında

Sadece bazı koyabilirsiniz nereye çalışamaz " eğer null "içeriyorsa.

Nasıl yapılacağını öneren herhangi biri olabilir mi?

İşte

benim kodu ...

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

cevap

17

.ToString() kullanmayın, değer null olduğunda null reference exception neden olur. Convert.ToString() kullanın, boş değer dizesini boş değer için döndürür.

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

Gittim Sonunda bu - çok teşekkürler! –

+0

'.length?' like, 'Convert.ToString (row.Cells [i + 1,] kullanıyorum için iyi mi 1] .Value2) .Length'; ??? –

3

Sen ToString çağrısı önce onlara ihtiyacımız var. Belki boş satır eklemek için yararlı olmadığını düşünüyorum çünkü sen bile eklemeden önce eğer hareket edebilir, ama bu kudreti kokteyl senaryonuzdaki gerçek olamayacak:

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

Aksi takdirde bu neye ihtiyacınız muhtemelen:

istisnasız arkasında
col1 = row.Cells[i + 1, 1].Value2 != null ? row.Cells[i + 1, 1].Value2.ToString() : null, 

nedeni dönüş değerlerinin çalışma belirlenir böylece Value2, bir dynamic olmasıdır. Ve Value2null ise, ToString yöntemini arayamaz.

+0

sen lekeli olarak, benim senaryo sütun 3 Almak istediğim yok veri içerdiğinden, bu satır 2'dir. Toplamda 17 sütun var :( –

+0

@TrevorDaniel: Tamam, sonra ikinci kod örneğini gör. –

+0

Sık sık kullanırsanız bu mantığı bir yöntemde bile bölebilirsiniz –

0

Sen döngü içinde iç kontrol edebilirsiniz:

//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(); 
     } 
      }); 
     } 
    } 
İlgili konular