2017-03-01 3 views
0

엑셀 파일 업로드 작업 중입니다. 다음과 같이 datatable으로 변환했습니다.엑셀 시트 업로드 및 다른 모델 클래스 매핑하기

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 클래스가 있습니다. 그러나 overrideable 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 개의 열을 유지하는 방법은 무엇입니까? – Sana

+1

내가 원하는대로 디자인을 변경했습니다. 모델은 이제 "Model1"입니다. 이제 팩토리는 채우려는 모델 이름을 사용합니다. 각 모델에는 필요에 따라 필드를 채우기 위해 모든 열 값을 사용할 수 있도록 데이터 테이블을 가져 오는 자체 overrideable populate 메소드가 있습니다. – Wheels73

+0

위와 같이 Excelable 열 사이의 매핑 방법이 datatable 단계없이 직접 다른 모델 목록에 있습니다. – Sana