2016-06-02 2 views
2

내 MVC 컨트롤러에서 한 줄씩 Excel을 읽으려고합니다. 그러나 잡기가있다.EPPlus를 사용하여 C#에서 행별로 파일을 Excel에서 읽는 방법

목록에 매핑 할 수 있기를 원합니다. 그리고 모델 클래스는 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; } 
} 

캐치

내가 열 머리글에 따라이 분야에 엑셀에서 필드를 매핑해야합니다. 여기처럼 엑셀에서 열 머리글 내가 모델 필드 "cnst_first_nm"에 열 머리글 "이름"의 값을 넣을 수 있어야 하드 코딩하지 않고 그래서

enter image description here

될 수 있습니다. 등등.

이 열은 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); 

       } 

:

내가 좋아하는 것을 시도했다. 나는 뭔가를 놓친다는 것을 알고있다. 무엇을 할 수 있습니까?

답변

3

따라서 하드 코딩을 사용하지 않으면 열 머리글 "First Name"아래의 값을 모델 필드 "cnst_first_nm"에 넣을 수 있어야합니다. 등등.

나는 여기서 무엇을 의미하는지 확신 할 수는 없지만 헤더 값이 어떤 속성에 매핑되는지 코드에 알리는 방법이 필요합니다.

나라면지도 값을 GroupMembershipUploadInput 개체의 매핑 된 속성을 설정하는 Action<strng, GroupMembershipUploadInput>으로 매핑하면됩니다.

그래서 나는 모든 '세터의 행동을지도하기 위해이 같은 뭔가를 시작 했죠 :

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> 
    }; 

우리는 우리가 가져 오는 파일의 각 열 머리글의 인덱스를 찾아야합니다. 이 순서로 우리에게 모든 열 머리글의 List을 제공

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); 
} 

: 헤더가 첫 번째 행에있는 가정, 그리고 우리가 어떤 필드를 건너 뛰는에 대해 걱정할 필요가 없습니다 가정, 우리는 뭔가를 할 수 있습니다 엑셀 워크 시트에 나타납니다.

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); 

} 
: 이제 우리는 먼저 우리의 객체에 값을 설정하기 위해 매핑 Action<string,GroupMembershipUploadInput>를 호출 &를 검색하는 우리의 정렬 된 목록에서 열 머리글을 검색하여 함수를 완료 할 수 있습니다
관련 문제