如何将Epplus与包含少量行

时间:2016-05-02 08:25:33

标签: c# asp.net-mvc excel epplus

我想使用epplus导入一些excel文件 问题是某些单元格包含多行(这会导致问题

我的excel看起来像这样(在现实中他们是更多的测试(test2,test3 ....)

enter image description here

我只能通过这个算法得到第一列......但是获得seconde列会更复杂

 //this is the list than contain applications (column 2)
ICollection<Application> applications = new  List<Application>();
            int i = 0;

            for (int j = workSheet.Dimension.Start.Row;
                    j <= workSheet.Dimension.End.Row;
                    j=i+1)
            {
                 //this is the object that contain the first column
                //and also a list of the second column  (foreach domain thei `is a list of applications (column 2)`          
                Domaine domaine = new Domaine();

                i += 1;

                //add here and  not last row
                while (workSheet.Cells[i, 1].Text == "" && i < workSheet.Dimension.End.Row)
                {

                    i++;
                }

                if (i > workSheet.Dimension.End.Row)
                    break;
                domaine.NomDomaine = workSheet.Cells[i, 1].Text;
                domaines.Add(domaine);

            }

编辑:换句话说,它们是获取一个单元格中行数的方法,或者是复制单元格中每行值的方法

(例如,如果我有第1行到第14行的单元格,第5行有值) 如何将该文本复制到所有行(这将有助于我解决问题)

1 个答案:

答案 0 :(得分:5)

这些被称为合并细胞。合并单元格中的值存储在合并范围中第一个单元格的.Value属性中。这意味着我们需要做更多的工作才能使用EPPlus从合并的单元格中读取值。

EPPlus为我们提供了一些有助于我们获得正确参考的属性。首先,我们可以使用单元格的.Merge属性来确定它是否是合并范围的一部分。然后我们可以使用工作表的.MergedCells属性来查找相关范围。然后只需找到该范围内的第一个单元格并返回该值。

所以,总结一下:

  1. 使用.Merge
  2. 确定我们需要读取的单元格是否属于合并范围的一部分
  3. 如果是这样,请使用工作表的.MergedCells属性
  4. 获取合并范围的索引
  5. 从合并范围内的第一个单元格中读取值
  6. 将这些放在一起我们可以派生一个小帮助方法来获取工作表对象和行/列索引以返回值:

    static string GetCellValueFromPossiblyMergedCell(ExcelWorksheet wks, int row, int col)
    {
        var cell = wks.Cells[row, col];
        if (cell.Merge)                                              //(1.)
        {
            var mergedId = wks.MergedCells[row, col];                //(2.)
            return wks.Cells[mergedId].First().Value.ToString();     //(3.)
        }
        else
        {
            return cell.Value.ToString();
        }
    }
    

    工作示例

    如果我有这样的域类:

    class ImportedRecord
    {
        public string ChildName { get; set; }
        public string SubGroupName { get; set; }
        public string GroupName { get; set; }
    }
    

    我想从一个看起来像这样的电子表格中读取:

    excel screenshot

    然后我可以使用这个方法:

    static List<ImportedRecord> ImportRecords()
    {
        var ret = new List<ImportedRecord>();
        var fInfo = new FileInfo(@"C:\temp\book1.xlsx");
        using (var excel = new ExcelPackage(fInfo))
        {
            var wks = excel.Workbook.Worksheets["Sheet1"];
            var lastRow = wks.Dimension.End.Row;
    
            for (int i = 2; i <= lastRow; i++)
            {
                var importedRecord = new ImportedRecord
                {
                    ChildName = wks.Cells[i, 4].Value.ToString(),
                    SubGroupName = GetCellValueFromPossiblyMergedCell(wks,i,3),
                    GroupName = GetCellValueFromPossiblyMergedCell(wks, i, 2)
                };
                ret.Add(importedRecord);
            }
        }
    
        return ret;
    }
    
    static string GetCellValueFromPossiblyMergedCell(ExcelWorksheet wks, int row, int col)
    {
        var cell = wks.Cells[row, col];
        if (cell.Merge)
        {
            var mergedId = wks.MergedCells[row, col];
            return wks.Cells[mergedId].First().Value.ToString();
        }
        else
        {
            return cell.Value.ToString();
        }
    }