如何使用包含less量行的单元格的Epplus

我想用epplus导入一些excel文件,问题是一些单元格包含多行(并且导致一个问题

我的excel看起来像这样(在实际上他们是更多的testing(test2,test3 ….)

在这里输入图像说明

我只能通过这个algorithm得到第一列。但是得到第二列会更加复杂

//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有价值)如何复制到所有行的文本(这将帮助我解决问题)

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

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

总之:

  1. 确定我们需要读取的单元格是否是使用.Merge的合并范围的.Merge
  2. 如果是这样,请使用工作表的.MergedCells属性获取合并范围的索引
  3. 读取合并范围中第一个单元格的值

把它们放在一起,我们可以派生出一个小的帮助方法来获取工作表对象和行/列索引,以便返回值:

 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截图

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

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