2015-08-31 2 views
2

Я разбираю документ excel в System.Array, а затем используя эти данные для разработки DataTable. Проблема в том, что не каждый элемент в System.Array содержит строку и имеет значение null. Смотрите изображение ниже:Как вы проверяете нулевые элементы в System.Array

enter image description here

Мой вопрос заключается в том, как я могу проверить для нулевого случая.

Вот мой метод:

public static System.Data.DataTable ConvertCSVtoDataTable(string strFilePath) 
    { 
     System.Data.DataTable dt = new System.Data.DataTable(); 
     StreamReader sr = new StreamReader(strFilePath); 
     string[] headers = sr.ReadLine().Split(','); 
     foreach (string header in headers) 
      dt.Columns.Add(header); 
     sr.Close(); 

     Microsoft.Office.Interop.Excel.Workbook wb = null; 
     Microsoft.Office.Interop.Excel.Worksheet ws = null; 
     Microsoft.Office.Interop.Excel.Application app = null; 
     int lastRow = 0; 

     app = new Microsoft.Office.Interop.Excel.Application(); 
     app.Visible = false; 
     wb = app.Workbooks.Open(strFilePath); 
     ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets[1]; 
     lastRow = ws.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Row; 
     int currentRow = 0; 
     for (int index = 2; index <= lastRow; index++) 
     { 
      System.Array values = (System.Array)ws.get_Range("A" + index.ToString(), "M" + index.ToString()).Cells.Value; 

       dt.Rows.Add(); 
      dt.Rows[currentRow]["Plugin ID"] = values.GetValue(1, 1).ToString(); 
      dt.Rows[currentRow]["CVE"] = values.GetValue(1, 2).ToString(); 
      dt.Rows[currentRow]["CVSS"] = values.GetValue(1, 3).ToString(); 
      dt.Rows[currentRow]["Risk"] = values.GetValue(1, 4).ToString(); 
      dt.Rows[currentRow]["Host"] = values.GetValue(1, 5).ToString(); 
      dt.Rows[currentRow]["Protocol"] = values.GetValue(1, 6).ToString(); 
      dt.Rows[currentRow]["Port"] = values.GetValue(1, 7).ToString(); 
      dt.Rows[currentRow]["Name"] = values.GetValue(1, 8).ToString(); 
      dt.Rows[currentRow]["Synopsis"] = values.GetValue(1, 9).ToString(); 
      dt.Rows[currentRow]["Description"] = values.GetValue(1, 10).ToString(); 
      dt.Rows[currentRow]["Solution"] = values.GetValue(1, 11).ToString(); 
      dt.Rows[currentRow]["See Also"] = values.GetValue(1, 12).ToString(); 
      dt.Rows[currentRow]["Plugin Output"] = values.GetValue(1, 13).ToString(); 
      currentRow++; 
     } 
     return dt; 
    } 

Вот некоторые проверки, которые я пробовал, но не работали

if (!values.Equals(null)) 
    dt.Rows[currentRow]["CVSS"] = values.GetValue(1, 3).ToString(); 
else 
    dt.Rows[currentRow]["CVSS"] = ""; 

Оказывается это не работает, потому что кажется, что это проверка чтобы увидеть, существуют ли какие-либо элементы, а не если specfic-элемент в этом месте равен NULL.

if (values.GetValue(1, 3).ToString() == null) 
    dt.Rows[currentRow]["CVSS"] = ""; 
else 
    dt.Rows[currentRow]["CVSS"] = values.GetValue(1, 3).ToString(); 

Это проливает NullReferenceExecption: Object reference not set to an instance of an object.

+4

Вы не можете вызывать 'ToString()' on null. Ваш if должен быть: 'if (values.GetValue (1,3) == null)', учитывая, что 'values' сам не является нулевым –

+0

, а вместо' ToString' вы можете использовать 'Convert.ToString (...)' , Кажется, в этом случае вам не нужно в 'if' – Grundy

ответ

1
  • Выражение values.Equals(null) отбросит на null, он не вернется true.
  • Вызов anything.ToString() также будет набрасываться на null, он не вернет ссылку на строку null (или пустой).

То, что вы хотите сделать, это, вероятно, просто:

if(values.GetValue(1, 3) == null) ... 
+0

Спасибо большое :) – Chris

1

Изменение if (values.GetValue(1, 3).ToString() == null) в

if (values.GetValue(1, 3) == null) 


Эффективно ваш if, как вы написали, что может быть "переведены" в if(null.ToString() ...) в случае, когда само значение равно нулю. И вы ничего не можете называть null.

Смежные вопросы