C # EPPlus – Сортированная вставка данных создает пустой патрон строк

У меня есть файл excel, содержащий информацию о категории продукта:

FatherId | CategoryId | CategoryLevel | CategoryName 

Мне нужно создать иерархию для каждой категории, например:

  A.Id | |__A.FatherId = B.Id | |__B.FatherId = C.Id... 

Я мог бы цикл несколько раз через файл excel и строить иерархию. Но я считаю, что это действительно неэффективно. Я решил разделить каждый уровень (до 9 уровней) на разные файлы excel. Я делаю это, вставляя каждый новый идентификатор категории в нужное место, чтобы создать упорядоченный файл. Проблема с моим кодом заключается в том, что иногда я «создаю» несколько пустых строк, и я не могу понять, почему.

Вот код, который обрабатывает это:

 int integerPosition = 2; while (!string.IsNullOrEmpty(worksheet.Cells["A" + integerPosition].Text)) { string parentId = worksheet.Cells["A" + integerPosition].Text.Trim(); string id = worksheet.Cells["B" + integerPosition].Text.Trim(); string type = worksheet.Cells["C" + integerPosition].Text.Trim(); // string subType = worksheet.Cells["D" + integerPosition].Text.Trim(); string name = worksheet.Cells["E" + integerPosition].Text.Trim(); string imageId = worksheet.Cells["F" + integerPosition].Text.Trim(); if (string.IsNullOrEmpty(id) || string.IsNullOrWhiteSpace(id)) { throw new Exception($"Id at position B{integerPosition} is empty"); } CategoryLevel level = ParseCategoryLevelFromString(type); // If you take a look it might seems that ids are not correctly ordered. // But since some ids are strings and others are numbers we treat both as strings. // So, for example, id1: 10000023, id2: 5432 -> id1 < id2, because id1[0] < id2[0].. long indexToInsert = FindInsertionIndexDichotomically( id, position => { string requestedId = tempWorksheets[level].Cells["B" + (position + 1)].Text; if (string.IsNullOrEmpty(requestedId) || string.IsNullOrWhiteSpace(requestedId)) { Console.WriteLine($"[{integerPosition}] RequestedId at position B{position + 1} is empty"); } return requestedId; }, lastUsedPositions[level] ); // If the cell at index indexToInsert is empty there's no need to add any row if (tempWorksheets[level].Cells["B" + (indexToInsert + 1)].Value != null) { tempWorksheets[level].InsertRow((int)indexToInsert + 1, 1); Utilities.LogInfo($"[{level}] Inserted row at position: {indexToInsert + 1}", LogFilePath); } tempWorksheets[level].SetValue("A" + (indexToInsert + 1), parentId); tempWorksheets[level].SetValue("B" + (indexToInsert + 1), id); tempWorksheets[level].SetValue("C" + (indexToInsert + 1), name); tempWorksheets[level].SetValue("D" + (indexToInsert + 1), imageId); Utilities.LogInfo($"[{level}] Written category ({id}) at row: {indexToInsert + 1}", LogFilePath); // Update the number of element inserted lastUsedPositions[level]++; integerPosition++; } 

И вот код для FindInsertionIndexDichotomically :

 private static long FindInsertionIndexDichotomically<T>(T target, Func<long, T> getElementAtIndex, long count, Func<T, T, int> customComparison = null) where T : IComparable { Func<T, T, int> compare = customComparison ?? ((arg1, arg2) => arg1.CompareTo(arg2)); #region Boundary condition // The collection is empty if (count == 0) { return 0; } // The element to insert is smaller or equal then the first element if (compare(target, getElementAtIndex(0)) <= 0) { return 0; } // The element to insert is grater or equal then the last element if (compare(target, getElementAtIndex(count - 1)) >= 0) { return count; } #endregion // ReSharper disable once ConvertToLocalFunction Func<long, long, long> innerBinarySearch = null; // Do not collapse this line with a direct assignment, // otherwise _inner_bynarySearch cannot call itself innerBinarySearch = (left, right) => { // If the collection is odd we will eventually have left == right // If the collection is even we won't have left == right, but right will be smaller then left if (right <= left) { return compare(target, getElementAtIndex(left)) <= 0 ? left : left + 1; } long relativeCenter = left + (right - left) / 2; int comparisonResult = compare(target, getElementAtIndex(relativeCenter)); // The element is already present at relativeCenter if (comparisonResult == 0) { return relativeCenter; } // The element is to be inserted between left and relativeCenter - 1 (relativeCenter - 1, // we already checked the centered positon if (comparisonResult < 0) { return innerBinarySearch(left, relativeCenter - 1); } // The element is to be inserted between relativeCenter - 1 and right (relativeCenter + 1, // we already checked the centered positon return innerBinarySearch(relativeCenter + 1, right); }; return innerBinarySearch(0, count - 1); } 

После этой операции я получаю отсортированный файл excel, но иногда я получаю некоторые куски пустой строки (я проверял и у них нет содержимого. Исходный файл не имеет пробелов. Я не могу понять почему.

  • EPPUS mimetype, вызывающий предупреждение консультанта сайта mcaffee
  • Как удалить условные форматы для ячейки или диапазона с помощью EPPlus
  • Форматировать столбец excel для decimal, выполняющий экспорт из c #
  • Позиция рабочего листа вне диапазона. Соединение закрыто. При использовании EPPLUS
  • Открыть Excel с EPPlus без сохранения в файл
  • Автофильтр EPPlus работает только на последней ячейке
  • Загрузите большое количество данных Excel с помощью EPPlus
  • Вставить новую строку в excel EPPlus
  • Проверка / формула таблицы Excel не копируется в новую строку таблицы
  • EPPlus, Найти и установить значение для Именованного диапазона
  • EPPlus: столбец даты, возвращающий int, а не фактическое отображаемое текстовое значение
  • Interesting Posts

    Экспорт данных ретранслятора в Excel в C # .net

    Как получить данные из электронной таблицы Google по определенному значению в php?

    Не удалось получить диапазон листа excel

    Функция Excel – как исключить определенные алфавиты

    Как начать с определенной ячейки в цикле с помощью apache poi?

    Графическое построение в Excel из приложения C ++

    Установка диапазона одной таблицы, равной другой

    Большой файл excel, я пытаюсь найти дубликаты и скопировать остальные ячейки по дубликату в дубликат, который он находит

    VBA добавляет данные в последнюю строку в Excel 2010

    Отключить копирование и копирование / перемещение (из книги в рабочую книгу) без пропуски Формулы или лист ..?

    Как извлечь данные из электронной таблицы Google с помощью REGEXEXTRACT regex

    XSSFWorkbook остается в памяти

    Как добавить два числа в excel, сохраняя ведущие нули?

    C # Создание файла Excel – JET.OLEDB.4.0 и ACE.OLEDB.12.0 Вывод столбцов одинаковых данных в разных форматах дат

    В Таблице произошли ошибки при перезагрузке источника данных

    Давайте будем гением компьютера.