2016-10-03 84 views
1

所以我想讀取一個excel文件並將數據插入到類屬性中。我認爲這是一個問題時,我in​​stanitae類,但是我做這件事之前,我解析並將值添加到類。數據綁定返回空值

一旦解析完成 - 我調用綁定類,但它返回空值。

號呼叫

 TestData td = new TestData(); 

     XLReader.GetClassFromExcel<TestData>(1,1,1); 

     var ddddd = td.Title; //this is null. 

的Class

public class TestData 
{ 
    public string Title { get; set; } 
    public string Site { get; set; } 
    public string StartDate { get; set; } 
    public string EndDate { get; set; } 
    public string Email { get; set; } 
    public string OrderRef { get; set; } 
    public string ReqBy { get; set; } 
    public string ApprovedBy { get; set; } 

} 

的Excel的

public static class XLReader 
{ 
    /// <summary> 
    /// The deployment files folder name 
    /// </summary> 
    private static readonly string deploymentFilesFolderName = 
     Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

    public static List<T> GetClassFromExcel<T>(int fromRow, int fromColumn, int toColumn = 0) 
    { 

     var path = Path.Combine(deploymentFilesFolderName, @"Tools\TestData.xlsx"); 
     List<T> retList = new List<T>(); 
     using (var pck = new ExcelPackage()) 
     { 
      using (var stream = File.OpenRead(path)) 
      { 
       pck.Load(stream); 
      } 
      //Retrieve first Worksheet 
      var ws = pck.Workbook.Worksheets.First(); 
      //If the to column is empty or 0, then make the tocolumn to the count of the properties 
      //Of the class object inserted 
      toColumn = toColumn == 0 ? typeof(T).GetProperties().Count() : toColumn; 

      //Read the first Row for the column names and place into a list so that 
      //it can be used as reference to properties 
      List<string> columnNames = new List<string>(); 
      // wsRow = ws.Row(0); 
      foreach (var cell in ws.Cells[1, 1, 1, ws.Cells.Count()]) 
      { 
       columnNames.Add(cell.Value.ToString()); 
      } 

      //Loop through the rows of the excel sheet 
      for (var rowNum = fromRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
      { 
       //create a instance of T 
       T objT = Activator.CreateInstance<T>(); 
       //Retrieve the type of T 
       Type myType = typeof(T); 
       //Get all the properties associated with T 
       PropertyInfo[] myProp = myType.GetProperties(); 

       var wsRow = ws.Cells[rowNum, fromColumn, rowNum, ws.Cells.Count()]; 

       foreach (var propertyInfo in myProp) 
       { 
        if (columnNames.Contains(propertyInfo.Name)) 
        { 
         int position = columnNames.IndexOf(propertyInfo.Name); 
         //To prevent an exception cast the value to the type of the property. 
         var blah = Convert.ChangeType(wsRow[rowNum, position + 1].Value, propertyInfo.PropertyType); 
         propertyInfo.SetValue(objT,blah); 

        } 
       } 

       retList.Add(objT); 
      } 

     } 
     return retList; 
    } 
} 
+1

'變種TD = XLReader.GetClassFromExcel (1,1,1)[0];' –

+0

由於@KooKiz,工程。對我來說,下一步是如何在類中獲取數據,所以無論何時我調用TestData()。Site(在任何其他類中)它都會返回數據? –

+0

難道你只是'td.Site'來獲取數據嗎? – Ernie

回答

0

瓦時的解析恩我導入Excel數據,我總是創建一個字符串數組存儲的值與此代碼

package.Load(fileContent.InputStream); 
ExcelWorksheet workSheet = package.Workbook.Worksheets[1]; 

int totalRows = workSheet.Dimension.End.Row; 
int totalCols = workSheet.Dimension.End.Column; 
List<myObject> listMyObject = new List<myObject>(); 
for (int currentRow = 1; currentRow <= totalRows; currentRow++) 
{ 
    string[] resultRow = new string[totalCols]; 
    for (int currentCol = 1; currentCol <= totalCols; currentCol++) 
    { 
     //We read the entire line and store it in the array 
     resultRow[currentCol - 1] = (workSheet.Cells[currentRow, currentCol].Value != null) ? workSheet.Cells[currentRow, currentCol].Value.ToString() : ""; 
    } 

    //And now I can bind my array to my object 
    listMyObject.Add(myObjectHelper.Convert(resultRow)); 
} 
//Here i've got my list object 

我的陣列將包含在最壞的一個空字符串。在這種情況下,我知道我的Excel文件中沒有填充任何內容。

後,我我的字符串數組轉換爲我的對象