上传excel表并将其映射到不同的模型类

时间:2017-03-01 12:11:35

标签: c# excel models mapper

我正在处理上传excel文件。我把它转换为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 个答案:

答案 0 :(得分: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);

希望指出你正确的方向。