2017-03-01 100 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