如何使用EPPlus在c#中逐行读取excel文件

Str*_*der 3 c# excel epplus

在我的 MVC 控制器中,我试图逐行读取 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; }
}
Run Code Online (Sandbox Code Playgroud)

问题是

我应该根据列标题将excel中的字段映射到这个字段。像这里,excel中的列标题可以是

在此处输入图片说明

因此,无需硬编码,我应该能够将列标题“名字”下的值放入模型字段“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);

                }
Run Code Online (Sandbox Code Playgroud)

我无法解决。我知道某处我遗漏了一些东西。可以做什么?

Sur*_*shi 7

一个简单的例子

public void readXLS(string FilePath)
{
    FileInfo existingFile = new FileInfo(FilePath);
    using (ExcelPackage package = new ExcelPackage(existingFile))
    {
        //get the first worksheet in the workbook
        ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
        int colCount = worksheet.Dimension.End.Column;  //get Column Count
        int rowCount = worksheet.Dimension.End.Row;     //get row count
        for (int row = 1; row <= rowCount; row++)
        {
            for (int col = 1; col <= colCount; col++)
            {
                Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells[row, col].Value.ToString().Trim());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*t_R 5

因此,无需硬编码,我应该能够将列标题“名字”下的值放入模型字段“cnst_first_nm”。等等。

我不太确定你在这里的意思,但你需要一些方法来告诉你的代码哪个 excel 标头值映射到哪个属性。

如果是我,我会使用从标头值到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>
    };
Run Code Online (Sandbox Code Playgroud)

然后我们需要在我们正在导入的文件中找到每个列标题的索引。假设标题在第一行,并且假设我们不需要担心跳过任何字段,我们可以这样做:

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);
}
Run Code Online (Sandbox Code Playgroud)

这为我们提供List了所有列标题,按照它们在 Excel 工作表中出现的顺序。我们现在可以通过首先从我们的有序列表中检索列标题然后检索并调用 MappedAction<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);

}
Run Code Online (Sandbox Code Playgroud)