Как определить строку заголовка при использовании ClosedXML - PullRequest
0 голосов
/ 31 марта 2020

У меня есть небольшое приложение winforms, над которым я работаю и использую Closed XML для обработки наших файлов Excel. Я пытаюсь построить логи чтения c таким образом, чтобы независимо от того, в какой строке находились заголовки, я могу найти эту строку и работать с данными ниже. Поскольку наши отчеты поступают из нашей корпоративной системы отчетов, файлы не всегда совпадают в том месте, где они начинаются с данных, потому что при экспорте из нашей системы фильтры и выборки отчетов добавляются в верхние x строки, а затем в нижнюю, что запускает дамп данных. Так что сейчас единственный способ заставить его работать - это если вручную удалить все эти строки вверху и сделать строку заголовка первой строкой.

Мне нужна помощь в поиске " заголовок "строка на основе имен столбцов или любого другого метода. Я уже просмотрел их вики https://github.com/ClosedXML/ClosedXML/wiki, но в нем упоминается только работа с верхними и нижними колонтитулами печати. ​​

Здесь я считаю, что мне нужно сосредоточить свою работу, но неясно с чего начать:

    // Look for the first row used
    var firstRowUsed = ws.FirstRowUsed(); //{'Precision Calculator D'!A1:XFD1}
    //var firstRowUsed = "'Precision Calculator D'!A9:XFD9";

    // Narrow down the row so that it only includes the used part
    var udasRow = firstRowUsed.RowUsed(); //{'Precision Calculator D'!A10:A10}
    //var udasRow = "'Precision Calculator D'!A10:A10}";

    // Move to the next row (it now has the titles)
    udasRow = udasRow.RowBelow();

Есть отчеты, которые я пробовал, которые имеют заголовок, начинающийся со строки 5, и другие, которые начинаются со строки 7 и т. д., так что нет фактической строки, в которой они будут работать, поэтому нужно найти способ определить это автоматически. в любом случае, чтобы определить строку, в которой находятся имена столбцов? Столбцы всегда будут в одном и том же порядке, поэтому я определил те, которые я определил.

Так что натолкнулся на это в упоминании о закрытом XML, и это определение может помочь мне найти меня, где я должен быть, но неясно, как реализовать

var foundMonth = ws.Search("Month", System.Globalization.CompareOptions.OrdinalIgnoreCase);

Так как он возвращает IEnumerable, есть вероятность, что может быть несколько ячеек со значением «Месяц», и в моем файле, с которым я тестирую, есть 2 строки, содержащие слово и не уверен, как я могу определить в этом случае, что я хочу последнюю найденную ячейку, если есть несколько.

Решил проблему с возвращением нескольких ячеек, и теперь может определить, с какой строкой связаны заголовки следующее:

    var foundMonth = ws.Search("Month", System.Globalization.CompareOptions.OrdinalIgnoreCase);
    var monthRow = foundMonth.Last().Address.ToString();

До сих пор неясно, как реализовать это в исходном посте кода выше, чтобы firstRowUsed правильно отображался, в этом случае будет A11: XFD11

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020
var firstRowUsed = ws.Range(monthRow, lastcell).FirstRowUsed();

Эта строка предоставляет вам то же, что и строка ниже

var firstRowUsed = ws.FirstRowUsed();

Я попробовал этот лог c с 3 разными файлами, каждый из которых содержит все больше и меньше данных, а также имеет строку заголовка на разных рядах. и работает как шарм

0 голосов
/ 01 апреля 2020

После исчерпывающего поиска Closed XML и прочтения ряда других вопросов, я смог найти решение. Ниже приведен код, который поможет установить используемый диапазон на основе моей текущей структуры данных в файле.

    var foundMonth = ws.Search("Month", System.Globalization.CompareOptions.OrdinalIgnoreCase);            
    var monthRow = foundMonth.Last().Address;  // A11
    var lastcell = ws.LastCellUsed().Address; // BC3950
    var rangeUsed = ws.Range(monthRow, lastcell);

Поскольку я понятия не имею, где будет находиться строка заголовка от файла к файлу, я ищу мое имя заголовка столбца в столбце A, поскольку все используемые данные в основном представляют собой числа, я могу смело предположить, что в столбце A последний найденный экземпляр слова «Месяц» - это строка моего заголовка. С этим и последней использованной ячейкой я могу определить диапазон данных, как показано выше. Хотя мне все еще нужно выяснить, как заменить мой firstRowUsed logi c, чтобы он работал таким же образом, это на шаг ближе к окончательному решению. Я опубликую свои выводы по этому вопросу до того, как отмечу ответ на этот вопрос.

...