正在上传 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);
希望这能为您指明正确的方向。
我正在上传 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);
希望这能为您指明正确的方向。