如何在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); }