2017-03-01 31 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類,該類包含所有模型通用的屬性(如果需要)。但有一個可重寫的填充方法。然後創建繼承您的基本模型的子類,以獲得每種模型類型。下面我剛剛完成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列,其他4個使用這種方法? – Sana

+1

我已將設計更改爲您所需的。該模型現在是「Model1」。工廠現在採用您想要填充的型號名稱。每個模型都會有自己的可覆蓋的填充方法,該方法使用數據表,以便可以根據需要採用任何列值來填充字段。 – Wheels73

+0

好,是否有任何方式之間的Excel列映射到不同模型的列表直接沒有數據表步 – Sana

相關問題