正在上传 excel sheet 并将其映射到不同的模型 类

Uploading excel sheet and mapping it to different model classes

我正在上传 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;
}

现在我想创建一个 mapper 类型的东西,它将包含 datatable column 将转换为哪个模型的东西。然后将 datatable 转换为相应的模型列表。我不知道如何开始。

我会使用一个模型工厂,它将负责 return 为您提供您想要的模型。然后您可以将每个模型添加到列表中。

在下面的示例中,我们有一个 BaseModel class,如果需要,它包含所有模型共有的属性。但是有一个可覆盖的填充方法。然后创建子 classes,它为您拥有的每种模型类型继承您的基本模型。下面我刚刚完成 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 class return 根据模型名称填充所需模型的实例。

各型号可电话联系工厂

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

modelList.Add(myModel);

希望这能为您指明正确的方向。