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