private void GroupCellsHorizontal(IXLRange range, int[] groupRowNumbers) { IDictionary <int, (object StartCellValue, int StartColNum)> previousCellValues = new Dictionary <int, (object, int)>(); int colsCount = range.Columns().Count(); for (int colNum = 1; colNum <= colsCount; colNum++) { IXLRangeColumn col = range.Column(colNum); foreach (int rowNum in groupRowNumbers) { object cellValue = col.Cell(rowNum).Value; if (previousCellValues.TryGetValue(rowNum, out var previousResult)) { if (!previousResult.StartCellValue.Equals(cellValue)) { range.Range(rowNum, previousResult.StartColNum, rowNum, colNum - 1).Merge(); previousCellValues[rowNum] = (cellValue, colNum); } else if (colNum == colsCount) { range.Range(rowNum, previousResult.StartColNum, rowNum, colNum).Merge(); } } else { previousCellValues[rowNum] = (cellValue, colNum); } } } }
public void TableRange() { var wb = new XLWorkbook(); IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); IXLRangeColumn rangeColumn = ws.Column(1).Column(1, 4); rangeColumn.Cell(1).Value = "FName"; rangeColumn.Cell(2).Value = "John"; rangeColumn.Cell(3).Value = "Hank"; rangeColumn.Cell(4).Value = "Dagny"; IXLTable table = rangeColumn.CreateTable(); wb.NamedRanges.Add("FNameColumn", String.Format("{0}[{1}]", table.Name, "FName")); IXLRange namedRange = wb.Range("FNameColumn"); Assert.AreEqual(3, namedRange.Cells().Count()); Assert.IsTrue( namedRange.CellsUsed().Select(cell => cell.GetString()).SequenceEqual(new[] { "John", "Hank", "Dagny" })); }