如何在c#中使用EPPlus逐行读取excel文件
在我的MVC控制器中,我正在尝试逐行读取一行。 但是有一个问题!
我想能够将其映射到一个列表。 模型类包含29个字段。
public class GroupMembershipUploadInput { public string chpt_cd {get;set;} public string cnst_mstr_id {get;set;} public string cnst_prefix_nm {get;set;} public string cnst_first_nm {get;set;} public string cnst_middle_nm {get;set;} public string cnst_last_nm {get;set;} public string cnst_addr1_street1 {get;set;} public string cnst_addr1_street2 {get;set;} public string cnst_addr1_city {get;set;} public string cnst_addr1_state {get;set;} public string cnst_addr1_zip {get;set;} public string cnst_addr2_street1 {get;set;} public string cnst_addr2_street2 {get;set;} public string cnst_addr2_city {get;set;} public string cnst_addr2_state {get;set;} public string cnst_addr2_zip {get;set;} public string cnst_phn1_num {get;set;} public string cnst_phn2_num {get;set;} public string cnst_phn3_num {get;set;} public string cnst_email1_addr {get;set;} public string cnst_email2_addr {get;set;} public string job_title {get;set;} public string company_nm {get;set;} public string grp_cd {get;set;} public string grp_nm {get;set;} public string rm_ind {get;set;} public string notes {get;set;} public string stuart_cnst_grp_key {get;set;} public string created_by {get;set;} public string created_dt {get;set;} } public class ListGroupMembershipUploadInput { public List<GroupMembershipUploadInput> GroupMembershipUploadInputList { get; set; } }
赶上了
我应根据列标题将excel中的字段映射到这些字段。 像这里的excel列标题可以
所以,没有硬编码,我应该能够将列标题“First Name”下的值放到模型字段“cnst_first_nm”中。 等等。
在excel中这个列也不需要这个顺序。 所以需要灵活。
我正在尝试像:
ExcelPackage ep = new ExcelPackage(new FileInfo(savedFilePath)); ExcelWorksheet ws = ep.Workbook.Worksheets["Sheet1"]; ListGroupMembershipUploadInput gl = new ListGroupMembershipUploadInput(); for (int i = 3; i <= ws.Dimension.End.Row; i++) { GroupMembershipUploadInput gm = new GroupMembershipUploadInput(); for (int j = ws.Dimension.Start.Column; j <= ws.Dimension.End.Column; j++) { //gm.cnst_first_nm = ws.Cells[i, j].Value.ToString(); } gl.Add(gm); }
我无法整理出来。 我知道某处我失去了一些东西。 可以做什么?
所以,没有硬编码,我应该能够将列标题“First Name”下的值放到模型字段“cnst_first_nm”中。 等等。
我并不十分确定你的意思,但是你需要一些方法来告诉你的代码哪个excel header值映射到哪个属性。
如果是我,我会做这个从一个映射到标题值到一个Action<strng, GroupMembershipUploadInput>
,它在给定的GroupMembershipUploadInput
对象上设置映射的属性。
所以我会从这样的事情开始,以映射所有'setter'动作:
Dictionary<string, Action<string, GroupMembershipUploadInput>> MapFieldSetters { get; set; } = new Dictionary<string, Action<string, GroupMembershipUploadInput>>() { { "First Name", (s,g) => g.cnst_first_nm = s }, { "Last Name", (s,g) => g.cnst_Last_nm = s }, //... <snip> };
然后我们需要在我们导入的文件中find每个列标题的索引。 假设标题在第一行,并假设我们不需要担心跳过任何字段,我们可以做一些事情:
var columnHeadersInOrder = new List<string>(); for (int col = 1; col <= ws.Dimension.End.Column; col++) { var headerValue = ws.Cells[1, col].Value.ToString(); columnHeadersInOrder.Add(headerValue); }
这给了我们一个所有列标题的List
,他们出现在Excel工作表中的顺序。 我们现在可以完成你的function,首先从我们的有序列表中检索列标题,然后检索并调用Mapped Action<string,GroupMembershipUploadInput>
来设置我们对象的值:
for (int i = 3; i <= ws.Dimension.End.Row; i++) { GroupMembershipUploadInput gm = new GroupMembershipUploadInput(); for (int j = ws.Dimension.Start.Column; j <= ws.Dimension.End.Column; j++) { var columnHeader = columnHeadersInOrder[j - ws.Dimension.Start.Column]; var cellValue = ws.Cells[i, j].Value.ToString(); MapFieldSetters[columnHeader](cellValue, gm); } gl.Add(gm); }