2017-03-01 9 views
0

私はExcelファイルのアップロードに取り組んでいます。私はdatatableに以下のように変換しました。Excelシートをアップロードし、異なるモデルクラスにマッピングする

public static DataTable ConvertExcelFileToDataTable(HttpPostedFileBase upload) 
{ 
    // ExcelDataReader works with the binary Excel file, so it needs a FileStream 
    // to get started. This is how we avoid dependencies on ACE or Interop: 
    Stream stream = upload.InputStream; 
    IExcelDataReader reader = null; 
    if (upload.FileName.EndsWith(".xls")) 
    { 
     reader = ExcelReaderFactory.CreateBinaryReader(stream); 
    } 
    else if (upload.FileName.EndsWith(".xlsx")) 
    { 
     reader = ExcelReaderFactory.CreateOpenXmlReader(stream); 
    } 
    reader.IsFirstRowAsColumnNames = true; 
    DataTable dtProductCatalog = reader.AsDataSet().Tables[0]; 
    reader.Close(); 

    return dtProductCatalog; 
} 

は、今私はdatatable columnがどのモデルに変換するものが含まれていますマッパータイプのものを作成したいです。そしてdatatableをモデルのそれぞれのリストに変換します。私はどのようにそれを開始するか分からない。

答えて

1

希望のモデルを返却するモデル工場を使用します。各モデルをリストに追加することができます。

以下の例では、必要に応じてすべてのモデルに共通のプロパティを保持するBaseModelクラスがあります。しかし、オーバーライド可能なpopulateメソッドがあります。そして、あなたが持っているモデルの種類ごとにベースモデルを継承するサブクラスを作成します。私はちょうどModel1をやった。

public class BaseModel 
{ 
    //Common Properties here. 
    public virtual void PopulateData(DataTable data) 
    { 
     //Override 
    } 
} 

public class Model1 : BaseModel 
{ 
    //Model 1 Properties here. 
    public string Name { get; set; } 

    public override void PopulateData(DataTable data) 
    { 
     //Set all model values here from datatable.  
    } 
} 



public class ModelFactory 
{ 
    private BaseModel _model; 

    public BaseModel ReturnModelByName(string modelName, DataTable dtProductCatalog) 
    { 
     switch (modelName) 
     { 
      case "Model1": 
       _model = new Model1(); 
       _model.PopulateData(dtProductCatalog); 
       break; 

      case "Model2": //etc.... 
       break; 
     }  
     return _model; 
    } 
} 

次にあなたのモデル名に基づいて、必要なモデルの人口のインスタンスを返すようにModelFactoryクラスを使用します。

モデルごとに工場に電話することができます。

var modelFactory = new ModelFactory(); 
var modelList = new List<BaseModel>(); 
var myModel = modelFactory.ReturnModelForColumn("Model1", dtProductCatalog); 

modelList.Add(myModel); 

正しい方向を指していることを願っています。

+0

3つの列を1つのモデルに保存するにはどうしたらいいですか? – Sana

+1

私はあなたが必要とするようにデザインを変更しました。モデルは現在 "Model1"です。ファクトリは、設定するモデル名を取得するようになりました。各モデルには、データ表を取り込むための任意の列値を必要に応じてフィールドに取り込むことができる独自のオーバーライド可能な作成メソッドがあります。 – Wheels73

+0

ExcelとExcelの間のマッピング方法はありますか? – Sana

関連する問題