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

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

现在我想创build一个映射器types的东西 ,将包含哪个数据表datatable column将转换为哪个模型。 然后将数据表转换为相应的模型列表。 我不知道如何开始。

我会使用一个模型工厂,将负责返回您所需的模型。 然后,您可以将每个模型添加到列表中。

在下面的例子中,我们有一个BaseModel类,它包含所有模型通用的属性(如果需要的话)。 但有一个可重写的填充方法。 然后创buildinheritance你的每个模型types的基础模型的子类。 下面我刚刚完成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); 

希望你指出正确的方向。

Interesting Posts