public void EvaluateLoops(ISheet sheet) { for (var r = sheet.FirstRowNum; r <= sheet.LastRowNum; r++) { var row = sheet.GetRow(r); if (row == null) { continue; } var rowIndex = 0; foreach (var cell in row.Cells) { // skip affected rows if (rowIndex > row.RowNum) { continue; } var cellValue = GetStringCellValue(cell); if (LiquidHelper.ContainsLiquidTag(cellValue) && Regex.IsMatch(cellValue, @"{%\s*for")) { var loop = LiquidLoop.Parse(LiquidHelper.UnwrapLiquidTag(cellValue)); if (loop == null) { continue; } loop.NumOfRepeats = Binder.Count(loop.CollectionName); rowIndex = row.RowNum + 1; while (loop.Next()) { WorkbookProvider.DuplicateRow(sheet, rowIndex); EvaluateRow(sheet.GetRow(rowIndex), loop); rowIndex++; } // check only first cell break; } } } }