如何从excel快速读取数据并将其从文件流转换为列表

时间:2016-07-08 03:52:31

标签: c# excel epplus

我正在使用 EPPlus

我上传的Excel包含第2行的列标题。从第4行开始,它的数据可能会有2k条记录。

enter image description here

我这样做,需要花费大量时间阅读2k记录并列入清单。

   using (var excel = new ExcelPackage(hpf.InputStream))
    {                          

        var ws = excel.Workbook.Worksheets["Sheet1"];

        //Read the file into memory

        for (int rw = 4; rw <= ws.Dimension.End.Row; rw++)
        {
            if (!ws.Cells[rw, 1, rw, 24].All(c => c.Value == null))
            {
                int headerRow = 2;

                GroupMembershipUploadInput gm = new GroupMembershipUploadInput();

                for (int col = ws.Dimension.Start.Column; col <= ws.Dimension.End.Column; col++)
                {
                    var s = ws.Cells[rw, col].Value;

                    if (ws.Cells[headerRow, col].Value.ToString().Equals("Existing Constituent Master Id"))
                    {
                        gm.cnst_mstr_id = (ws.Cells[rw, col].Value ?? (Object)"").ToString();
                    }
                    else if (ws.Cells[headerRow, col].Value.ToString().Equals("Prefix of the constituent(Mr, Mrs etc)"))
                    {
                        gm.cnst_prefix_nm = (ws.Cells[rw, col].Value ?? (Object)"").ToString();
                    }

                }
                lgl.GroupMembershipUploadInputList.Add(gm);
            }
        }

GroupMembershipUploadInputList是GroupMembershipUploadInput类型的对象列表,我在从单元格读取后添加excel值。

可以更快地完成吗?我在这里错过了什么?

请帮助改善表现。

1 个答案:

答案 0 :(得分:0)

你在那里进行了很多迭代,对于每一行,你每次访问每一列两次。我假设您每行只需要这两个值,如果是这样,以下代码将大大减少时间:

using (var excel = new ExcelPackage(hpf.InputStream))
{

    var ws = excel.Workbook.Worksheets["Sheet1"];
    int headerRow = 2;
    // hold the colum index based on the value in the header
    int col_cnst_mstr_id = 2;
    int col_cnst_prefix_nm = 4;
    // loop once over the columns to fetch the column index
    for (int col = ws.Dimension.Start.Column; col <= ws.Dimension.End.Column; col++)
    {
        if ("Existing Constituent Master Id".Equals(ws.Cells[headerRow, col].Value))
        {
            col_cnst_mstr_id = col;
        }
        if ("Prefix of the constituent(Mr, Mrs etc)".Equals(ws.Cells[headerRow, col].Value))
        {
            col_cnst_prefix_nm = col;
        }
    }
    //Read the file into memory
    // loop over all rows
    for (int rw = 4; rw <= ws.Dimension.End.Row; rw++)
    {
        // check if both values are not null
        if (ws.Cells[rw, col_cnst_mstr_id].Value != null &&
            ws.Cells[rw, col_cnst_prefix_nm].Value != null)
        {
            // the correct cell will be selcted based on the column index
            var gm = new GroupMembershipUploadInput
            {
                cnst_mstr_id = (string) ws.Cells[rw, col_cnst_mstr_id].Value ?? String.Empty,
                cnst_prefix_nm = (string) ws.Cells[rw, col_cnst_prefix_nm].Value ?? String.Empty
            };

            lgl.GroupMembershipUploadInputList.Add(gm);
        }
    }
}

我删除了内部列循环并将其移动到方法的开头。它用于获取您感兴趣的每个字段的columnindex。现在也可以减少昂贵的空值检查。要获取该值,现在需要的只是行中的简单索引查找。