2016-03-22 15 views
0

Excelファイルをインポートしようとしています。これは私ののインポートメソッドのようです。私はここでやっているだけで、データテーブルにExcelのデータを追加し、動的リストにそのデータ・テーブルを変換し、コントローラメソッドにそれを返している:ダイナミックリストの値をリストオブジェクトに変換する

public List<dynamic> ImportFile(Stream stream) 
{ 
    var productList = new List<Products>(); 
    using (var package = new ExcelPackage(stream)) 
    { 
     var currentSheet = package.Workbook.Worksheets; 
     var workSheet = currentSheet.First(); 

     //Creating a DataTable 
     DataTable tbl = new DataTable(); 
     bool hasHeader = true; // adjust it accordingly(i've mentioned that this is a simple approach) 

     //Creating the header 
     foreach (var firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column]) 
     { 
      tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); 
     } 

     var startRow = hasHeader ? 2 : 1; 
     ////Inserting the stream into DataTable 
     for (var rowNum = startRow; rowNum <= workSheet.Dimension.End.Row; rowNum++) 
     { 
      var wsRow = workSheet.Cells[rowNum, 1, rowNum, workSheet.Dimension.End.Column]; 
      var row = tbl.NewRow(); 
      foreach (var cell in wsRow) 
      { 
       row[cell.Start.Column - 1] = cell.Text; 
      } 
      tbl.Rows.Add(row); 
     } 
     //Convert datatable into dynamic list 
     var dynamicDt = new List<dynamic>(); 
     foreach (DataRow row in tbl.Rows) 
     { 
      dynamic dyn = new ExpandoObject(); 
      dynamicDt.Add(dyn); 
      foreach (DataColumn column in tbl.Columns) 
      { 
       var dic = (IDictionary<string, object>)dyn; 
       dic[column.ColumnName] = row[column]; 
      } 
     } 
     return dynamicDt; 
    } 
} 

私のコントローラメソッドがどのように見えるかこれは:

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase upload) 
{ 
    IExcelImporter reader = new ExcelImporter(); 
    var res = new List<dynamic>(); 
    List<Products> send = new List<Products>(); 
    if (ModelState.IsValid) 
    { 
     if (upload != null && upload.ContentLength > 0) 
     { 
      Stream stream = upload.InputStream; 

      if (upload.FileName.EndsWith(".xlsx")) 
      { 
       //getting the dynamic list(returning dynamic list) 
       res = reader.ImportFile(stream); 

       //need to bind it a model-class(Products) 
       send = res.Select(x=> 
       new Products 
       { 
        ID = res.GetType().GetProperty("ID").ToString(), 
        Name = res.GetType().GetProperty("Name").ToString(), 
        //res.Select(e=>e.Price).ToString()//res.GetType().GetProperty("Price").GetValue(res, null).ToString() 
       }).ToList(); 
      } 
     } 
    } 
    return View("Index", send); 
} 

質問:私が欲しいのは、モデルクラス(製品)に動的リストをバインドすることです。ビューに戻すことができるように。 動的リストをList Productsにマップするにはどうすればよいですか?誰かが私にこの問題を解決する方法のアイデアをお願いすることができ

public class Products 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
    public string Price { get; set; } 

} 

:これは私の製品モデルは、どのように見えるかです

public interface IExcelImporter 
{ 
    List<dynamic> ImportFile(Stream stream); 
} 

これは私のIExcelImporterがどのように見えるかです。前もって感謝します。

+1

を使用する必要がありますか? – Shoe

+0

動的リストをモデルクラス(Products)にマップしてビューを返すことはできません – Dayan

+0

ダイナミックプロパティを取得してモデルクラスに投影するためのリフレクションを実行しているようです。それは働いていないのですか?どうしましたか? – Shoe

答えて

1

戻り値の型としてdynamicを使用する理由はありません。 ImportFileメソッドはIEnumerable<Dictionary<string, string>>を返す可能性があります。また、なぜDataTable?私はあなたがデータベースの使用のためにDataTableを使用している別の例から多くのコピー貼り付けを使用していると推測しています、列名を格納するための追加リストを作成して辞書のキーとして使用すると、鋳造。非常に単純化された例を示していない限り、ImportFileメソッドは、読みやすさとパフォーマンスの両方に大きなオーバーヘッドがあります。直接かかわらず、あなたの質問に答えるために

、ここで

あなたはList<dynamic>の非既存のプロパティ「ID」のPropertyInfoを得ている - ではないあなたが何をしたいです。

res.GetType().GetProperty("ID").ToString() 

代わりにあなたが得たものと間違って何

// Get value of dynamic property "ID" of an item when iterating over of List<dynamic> 
x.ID.ToString() 
関連する問題