У меня есть небольшое приложение 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