private int GetGroupInterval(IXLWorksheet ws, int groupRowNumber)
        {
            var i = groupRowNumber + 1;

            while (ws.Cell(i, ws.FirstColumnUsed().ColumnNumber()).Value.ToString().ToLower() != "понедельник")
            {
                i++;
            }

            return(i - groupRowNumber);
        }
        private void Parsing(IXLWorksheet worksheet, ITimetable timetable)
        {
            //нужно получить список групп
            //из них поймем длину таблицы (*кол-во столбцов)
            const int firstGroup = 4;                 //где неачинается полезная информация
            IXLRow    currentRow = FindRaw(worksheet, "№ гр.", 1);
            var       index      = firstGroup;        //начало групп

            while (!currentRow.Cell(index).IsEmpty()) //ищем конец групп
            {
                index++;
            }
            var lastGroup      = index - 1;
            var groupRow       = currentRow.Row(firstGroup, lastGroup); //строка групп
            var pastDaysBuffer = 0;                                     //сдвиг строк относительно предыдущих дней

            //берем range n-го интервала времени для всех групп
            var groupInterval = GetGroupInterval(worksheet, groupRow.RowNumber()); //кол-во строк для номера группы

            for (var dayIndex = 0; dayIndex < 6; dayIndex++)                       //+совместные пары для групп
            {
                //определяем, сколько пар в этом дне (может еще в 19:05 и еще одна быть)
                var lessonsCount = 1;
                var dayColumn    = worksheet.FirstColumnUsed();
                while (dayColumn.Cell(groupRow.FirstCell().Address.RowNumber + groupInterval - 1
                                      + lessonsCount * 4 + pastDaysBuffer).Style.Border.BottomBorder != XLBorderStyleValues.Medium)
                {
                    lessonsCount++;
                }

                //начинаем проверять каждое время на пары
                for (var timeIndex = 0; timeIndex < lessonsCount; timeIndex++)
                {
                    index = groupRow.FirstCell().Address.RowNumber + groupInterval + 4 * timeIndex + pastDaysBuffer; //индекс обрабатываемой строки
                    var currentRange = worksheet.Range(index, firstGroup, index + 3, lastGroup);
                    //идти по ней, проверяя на жирный текст
                    //при нахождении искать первую границу справа, потом снизу
                    for (var i = 1; i <= lastGroup - firstGroup + 1; i++)
                    {
                        for (var k = 1; k < 4; k += 2)
                        {
                            var currentCell = currentRange.Cell(k, i);
                            if (currentCell.IsMerged() && (currentCell.MergedRange().FirstCell() != currentCell))
                            {
                                continue;
                            }
                            if (currentCell.Style.Font.Bold && (currentCell.Value.ToString() != ""))
                            {
                                timetable.Lessons.Add(GetLessonData(worksheet, groupRow, currentRange, i, dayIndex, timeIndex, k));
                            }
                            if (currentCell.IsMerged())
                            {
                                var mergedRange = currentCell.MergedRange();
                                for (var j = 1; j <= mergedRange.ColumnCount(); j++)
                                {
                                    string group = worksheet.Cell(groupRow.FirstCell().Address.RowNumber, mergedRange.Cell(1, j).Address.ColumnNumber).Value.ToString();
                                    Lesson l     = timetable.Lessons[timetable.Lessons.Count - 1] as Lesson;                                   //я бегло не могу сообразить, что здесь может пойти не так, а глубже я уже не в состояни вникать
                                    timetable.Lessons.Add(new Lesson(l.Time, l.Type, group, l.Room, l.WeekType, l.Day, l.Teacher, l.Subject)); //работает - не трожь
                                }
                            }
                        }
                    }
                }
                pastDaysBuffer += lessonsCount * 4 + 1;
            }

            //return timetable;
        }